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: | Whole Thread | Raw Message | 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)
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 |