Re: Indices Reply-To: In-Reply-To: <410DBC03.80100@teleline.es>

From: Alvaro Herrera <alvherre(at)dcc(dot)uchile(dot)cl>
To: Felipe Fernandez <danielfm(at)teleline(dot)es>
Cc: postgresql <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Indices Reply-To: In-Reply-To: <410DBC03.80100@teleline.es>
Date: 2004-08-07 02:56:25
Message-ID: 20040807025625.GA12843@dcc.uchile.cl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

On Mon, Aug 02, 2004 at 04:58:59AM +0100, Felipe Fernandez wrote:
> Esto es con un indice que agrupa provincia, localidad, nombre,apellido1.
> Los tiempos son bastante pero que la anterior?
>
>
> explain analyze select * from abonados where localidad = 38038;
> QUERY PLAN
> -----------------------------------------------------------------------------------------------------------------------
> Seq Scan on abonados (cost=0.00..236123.08 rows=13013 width=105)
> (actual time=17.598..637110.190 rows=14475 loops=1)
> Filter: (localidad = 38038)
> Total runtime: 637644.316 ms
> (3 rows)

Esto no es de extran~ar. El indice que definiste no sirve para
contestar esta consulta. Necesitas otro indice.

> explain analyze select * from abonados where provincia = 38;
> QUERY PLAN
> -----------------------------------------------------------------------------------------------------------------------
> Seq Scan on abonados (cost=0.00..236123.08 rows=95414 width=105)
> (actual time=17.659..561143.309 rows=30104 loops=1)
> Filter: (provincia = 38)
> Total runtime: 561685.628 ms
> (3 rows)

Aqui simplemente el optimizador cree que con el indice la consulta sera
peor que sin el indice.

Realmente lo que debes hacer es definir cuales son las posibles
consultas que te interesa contestar, y en que tiempo es razonable
contestarlas. Realmente necesitas obtener treinta mil registros y
mostrarselos al usuario? En algunos de estos casos te puede ser mucho
mas util usar un cursor (con DECLARE) y aplicar FETCH de a trozos.

Para las consultas donde realmente necesites obtener los resultados
completos de a un solo bloque, creas indices especializados (la menor
cantidad posible) para contestar esas consultas en el menor tiempo
posible. Pero ten presente: un indice que requiere extraer 30000
registros puede no ser suficientemente selectivo, y por lo tanto
realmente es mejor extraer usando un recorrido secuencial e ignorar el
indice.

Otra cosa: para el indice mas usado con el cual quieras contestar
consultas de multiples resultados, considera usar CLUSTER. No uses
CLUSTER en la llave primaria, porque no ganas nada -- sirve cuando hay
mucha localidad en referencias, quizas como en tu primera consulta
ejemplo de este mail (si tuvieras un indice que sirviera, claro esta).

--
Alvaro Herrera (<alvherre[a]dcc.uchile.cl>)
"La naturaleza, tan frágil, tan expuesta a la muerte... y tan viva"

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Martin Marques 2004-08-07 12:00:03 Re: Ayuda Urgente
Previous Message Alvaro Herrera 2004-08-07 01:04:01 Re: Postgres tiene alguna recomendacion para la variable SHMMAX