Re: prioridad de indices en una consulta

From: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
To: Edwin Perez Lozano <edwinandperez(at)gmail(dot)com>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: prioridad de indices en una consulta
Date: 2007-11-13 22:13:38
Message-ID: 20071113221338.GG19014@alvh.no-ip.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Edwin Perez Lozano escribió:

> -> Bitmap Heap Scan on guia g (cost=1496.94..2216.65 rows=183
> width=560) (actual time=19318.934..19318.934 rows=0 loops=1)
> Recheck Cond: ((ciudad_origen = 12601) AND (fecha_manifiesto =
> '2007-10-29'::date))
> -> BitmapAnd (cost=1496.94..1496.94 rows=183 width=0) (actual
> time=19318.926..19318.926 rows=0 loops=1)
> -> Bitmap Index Scan on idx_guia_5 (cost=0.00..748.30 rows=36681
> width=0) (actual time=19220.018..19220.018 rows=1678544 loops=1)
> Index Cond: (ciudad_origen = 12601)
> -> Bitmap Index Scan on idx_guia_11 (cost=0.00..748.30
> rows=36681 width=0) (actual time=82.263..82.263 rows=1 loops=1)
> Index Cond: (fecha_manifiesto = '2007-10-29'::date)

> La consulta es muy lenta y por lo que pude observar es porque el explain
> me dice que primero hace :
> -> Bitmap Index Scan on idx_guia_5 (cost=0.00..748.30 rows=36681
> width=0) (actual time=19220.018..19220.018 rows=1678544 loops=1)
> Index Cond: (ciudad_origen = 12601)
> y luego hace el de fecha el cual me trae una cantidad menor de datos:
> -> Bitmap Index Scan on idx_guia_11 (cost=0.00..748.30 rows=36681
> width=0) (actual time=82.263..82.263 rows=1 loops=1)
> Index Cond: (fecha_manifiesto = '2007-10-29'::date)

Estas equivocado -- no es asi como funciona. Lo que hace en realidad es
construir dos mapas de bits recorriendo cada indice individualmente, y
luego aplicarles AND. Recien cuando eso esta hecho hace el recorrido
del heap para buscar las tuplas que coinciden con ambas condiciones.
Dado que AND es conmutativo, da exactamente lo mismo en que orden
aparezcan los indices ...

> La consulta no deberia primero aplicar el condicional de la fecha y
> luego aplicar el otro condicional (ciudad_origen) pero no encuentro la
> forma de indicarselo en el sql, alguien sabe como indicarselo al
> postgres?¿

Creo que el verdadero problema de tu sistema es que las estimaciones de
selectividad de ambos indices estan muy malas. Sospecho que deberias
aumentar el tamaño de muestreo para ambas columnas, luego hacer ANALYZE
de la tabla, y probar otra vez. (Aumentar tamaño de la muestra se hace
con ALTER TABLE ... SET STATISTICS).

La proxima vez que pegues un EXPLAIN, por favor pegalo directo desde
psql en un archivo de texto, y adjuntas el texto. No se como habras
obtenido el explain que pusiste arriba pero es bien dificil leerlo
porque la indentación no está igual al original. Otra idea es que lo
pegues en http://www.explain-analyze.info/ y nos mandes la URL. (Ese
sitio es bonito porque además te muestra con colores los nodos cuyas
estimaciones son muy malas, y otros chiches).

--
Alvaro Herrera http://www.PlanetPostgreSQL.org/
"La rebeldía es la virtud original del hombre" (Arthur Schopenhauer)

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message mariana chagra 2007-11-13 22:40:28 Cambio de Proyeccion
Previous Message Edwin Perez Lozano 2007-11-13 21:19:30 prioridad de indices en una consulta