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

Responder a