Re: Mejorar rendimiento en consulta usando fechas

From: Martín Marqués <martin(dot)marques(at)gmail(dot)com>
To: Rodrigo Ruiz <rruizf(at)gmail(dot)com>
Cc: Alvaro Herrera <alvherre(at)2ndquadrant(dot)com>, Ayuda <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Mejorar rendimiento en consulta usando fechas
Date: 2013-04-25 23:10:19
Message-ID: CABeG9LsKdE=_Rm55Nh9kopTD2JsNxK+ahNtLOppnA1Dhpe0LUw@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

El día 25 de abril de 2013 16:18, Rodrigo Ruiz <rruizf(at)gmail(dot)com> escribió:
> El 25/04/2013 16:03, Alvaro Herrera escribió:
>
>> Rodrigo Ruiz escribió:
>>
>> Hola Rodrigo,
>>
>>> Existe un campo llamado fecha_nacimiento y una consulta de ejemplo
>>> sería traer todos las personas que tengan entre 25 y 35 años a la
>>> fecha.
>>
>> Creo que el problema es que usar un índice en una consulta así no
>> serviría de mucho, porque supongo que el porcentaje de personas que
>> están en ese rango de fechas es muy alto. Si es el caso, es posible que
>> el plan que se está ejecutando sea realmente lo óptimo.
>>
>>> La consulta sería algo como:
>>>
>>> select * from persona where fecha_nacimiento between (current_date -
>>> interval '35 years') and (current_date - interval '25 years');
>>
>> Puedes mostrar un explain analyze de esta consulta?
>>
>
> 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"
>
> 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.
> Se me olvidó mencionar que el tipo de dato de fecha_nacimiento es date, no
> timestamp.

No comprendo bien. La consulta que se ejecuta finalmente tiene varios
filtros, además del de la edad (que podrías usar la función temporal
age()). En tal caso, que porcentaje de la tabla te retorna? Los otros
filtros disminuyen considerablemente la cantidad de tuplas en la
consulta?

Estaría bueno ver un explain analyze con la consulta a realizar, con
todos los filtros.

--
Martín Marqués
select 'martin.marques' || '@' || 'gmail.com'
DBA, Programador, Administrador

-
Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda(at)postgresql(dot)org)
Para cambiar tu suscripcin:
http://www.postgresql.org/mailpref/pgsql-es-ayuda

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Jaime Casanova 2013-04-26 03:52:02 Re: Mejorar rendimiento en consulta usando fechas
Previous Message Hanlle Nicolás 2013-04-25 21:07:10 Como puedo quitarme de esta lista?