Re: Mejorar rendimiento en consulta usando fechas

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

In response to

Responses

Browse pgsql-es-ayuda by date

  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