From: | Alvaro Herrera <alvherre(at)2ndquadrant(dot)com> |
---|---|
To: | Rodrigo Ruiz <rruizf(at)gmail(dot)com> |
Cc: | Ayuda <pgsql-es-ayuda(at)postgresql(dot)org> |
Subject: | Re: Mejorar rendimiento en consulta usando fechas |
Date: | 2013-04-25 19:43:32 |
Message-ID: | 20130425194332.GU2169@eldon.alvh.no-ip.org |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
Rodrigo Ruiz escribió:
> El 25/04/2013 16:03, Alvaro Herrera escribió:
> Hola Alvaro,
> el explain analyze de la consulta arrojó lo siguiente:
>
> "Index Scan using persona_fecha_nacimiento_idx on persona
> (cost=0.01..9.68 rows=1 width=835) (actual time=0.097..102908.235
> rows=699498 loops=1)"
> " Index Cond: ((fecha_nacimiento >= (('now'::text)::date - '35
> years'::interval)) AND (fecha_nacimiento <= (('now'::text)::date -
> '25 years'::interval)))"
> "Total runtime: 103004.026 ms"
Es curioso que use un indexscan en este caso; probablemente debería
estar usando un seqscan, o cuando mucho un bitmap scan. ¿No tendrás
enable_seqscan=off? ¿O quizás tienes otros parámetros del optimizador
puestos en valores inusuales?
> La consulta así como está, nunca se realizará, por ello trae muchas
> tuplas, sin embargo siempre se aplica al menos un filtro adicional
> como región, provincia o comuna. Este rango es menor a si por
> ejemplo selecciono las personas mayores de 45 años, que involucra
> cerca del 35% de los registros, algo así como 4 millones y medios de
> tuplas.
> Si no agrego el filtro de la fecha de nacimiento y busco por
> profesión o provincia por ejemplo, el tiempo baja a unos 10
> segundos, el problema está cuando en la consulta agrego un filtro
> por fechas.
Quizás el problema es que está siendo demasiado optimista con respecto
al índice por fecha y lo selecciona cuando no debería. Si tienes
múltiples filtros y cada uno tiene un índice, lo que debería suceder es
que haga un bitmap scan para cada índice y luego los mezcle usando un
"bitmapAnd". Pero muestra también los explain de las consultas que
realmente vas a ejecutar. (Es decir, no trates optimizar un problema
que no es el que tienes).
> Se me olvidó mencionar que el tipo de dato de fecha_nacimiento es
> date, no timestamp.
Un \d de la tabla podría resultar útil (pg_dump -s, para mejor
reproducibilidad en caso de que la cosa se alargue).
--
Álvaro Herrera http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services
-
Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda(at)postgresql(dot)org)
Para cambiar tu suscripción:
http://www.postgresql.org/mailpref/pgsql-es-ayuda
From | Date | Subject | |
---|---|---|---|
Next Message | Yanier Barbier Montoya | 2013-04-25 20:34:03 | RE: Como me puedo quitarme de esta lista |
Previous Message | Rodrigo Ruiz | 2013-04-25 19:18:35 | Re: Mejorar rendimiento en consulta usando fechas |