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.
Saludos.-
--
Rodrigo Ruiz Fuentes
-
Enviado a la lista de correo pgsql-es-ayuda ([email protected])
Para cambiar tu suscripci�n:
http://www.postgresql.org/mailpref/pgsql-es-ayuda