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 ([email protected])
Para cambiar tu suscripción:
http://www.postgresql.org/mailpref/pgsql-es-ayuda