Cordial saludo William. recomiendo ejecute varias veces la consulta para cargar en cache el resultado, si en cache la consulta es rápida puede ser problema de lentitud de disco duro, si la consulta sigue siendo lenta puede ser problema del planificador, el planificador de postgres no se puede manipular directamente, si puedes aumentar el costo de escaneo secuencial con set seq_page_cost = valor, tambien puede aumentar la muestra de la tabla con ALTER TABLE tabla ALTER COLUMN campo SET STATISTICS valor; o puede evitar que el planificado use escaneo secuencia con SET ENABLE_SEQSCAN = OFF; SELECT *** , igualmente es mejor es explain analyze.
para leerlo es asi: "Seq Scan on tblrec (cost=0.00..374.82 rows=13482 width=188) (actual time=11.660..44.122 rows=13482 loops=1)" "Seq Scan on tblrec (planificado) (real)" planificado: (cost=0.00..374.82 rows=13482 width=188) el primer registro lo trae en 0.00ms el ultimo en 974.82ms retorna 13482 registros width= no se real: ( time=11.660..44.122 rows=13482 loops=1) el primer registro lo traen en 11.66ms, el ultimo en 44.122 retorna 13482 registros y solo recorre una vez la tabla. si planificado.rows es muy diferente de real.rows debe modificar el STATISTICS del campo. también puede usar http://explain.depesz.com esta pagina muestra en rojo lo mas pesado de la consulta. empieza probando SET ENABLE_SEQSCAN = OFF; al inicio del sql. 2014-03-14 10:29 GMT-05:00 William Diaz Pabón <[email protected]>: > Hola lista. > > Tengo la siguiente consulta: > > SELECT > tarifa.consecutivo AS tarifa, > caracteristica_predio_oi_predio.oi_predio > FROM tarifa > JOIN caracteristica_predio_tarifa ON > caracteristica_predio_tarifa.tarifa::text = tarifa.consecutivo::text > > JOIN caracteristica_predio_oi_predio ON > caracteristica_predio_oi_predio.caracteristica_predio::text = > caracteristica_predio_tarifa.caracteristica_predio::text > AND caracteristica_predio_oi_predio.estado::text = 'ACTIVO'::text > AND (caracteristica_predio_oi_predio.vigencia::text = ''::text OR > caracteristica_predio_oi_predio.vigencia IS NULL OR > caracteristica_predio_oi_predio.vigencia::text = tarifa.vigencia::text) > > WHERE tarifa.estado::text = 'ACTIVO'::text > > > Y a las tablas le cree los siguientes indices: > > CREATE INDEX tarifa_estado_ix > ON tarifa USING btree (estado ASC NULLS LAST); > > CREATE INDEX caracteristica_predio_oi_predio_estado_ix > ON caracteristica_predio_oi_predio USING btree (estado ASC NULLS LAST); > > CREATE INDEX caracteristica_predio_oi_predio_caracteristica_predio_ix > ON caracteristica_predio_oi_predio USING btree (caracteristica_predio > ASC NULLS LAST); > > CREATE INDEX caracteristica_predio_oi_predio_vigencia_ix > ON caracteristica_predio_oi_predio USING btree (vigencia ASC NULLS > LAST); > > CREATE INDEX caracteristica_predio_oi_predio_vigencia_estado_ix > ON caracteristica_predio_oi_predio USING btree (vigencia, estado); > > > Pero haciendo un explain no los toma: > > "Hash Join (cost=62.82..2455.25 rows=102826 width=11)" > " Output: tarifa.consecutivo, caracteristica_predio_oi_predio.oi_predio" > " Hash Cond: > ((caracteristica_predio_oi_predio.caracteristica_predio)::text = > (caracteristica_predio_tarifa.caracteristica_predio)::text)" > " Join Filter: (((caracteristica_predio_oi_predio.vigencia)::text = > ''::text) OR (caracteristica_predio_oi_predio.vigencia IS NULL) OR > ((caracteristica_predio_oi_predio.vigencia)::text = > (tarifa.vigencia)::text))" > " -> Seq Scan on caracteristica_predio_oi_predio (cost=0.00..162.44 > rows=8595 width=29)" > " Output: caracteristica_predio_oi_predio.consecutivo, > caracteristica_predio_oi_predio.caracteristica_predio, > caracteristica_predio_oi_predio.oi_predio, > caracteristica_predio_oi_predio.vigencia, > caracteristica_predio_oi_predio.estado" > " Filter: ((estado)::text = 'ACTIVO'::text)" > " -> Hash (cost=59.97..59.97 rows=228 width=13)" > " Output: tarifa.consecutivo, tarifa.vigencia, > caracteristica_predio_tarifa.caracteristica_predio" > " -> Hash Join (cost=7.13..59.97 rows=228 width=13)" > " Output: tarifa.consecutivo, tarifa.vigencia, > caracteristica_predio_tarifa.caracteristica_predio" > " Hash Cond: ((tarifa.consecutivo)::text = > (caracteristica_predio_tarifa.tarifa)::text)" > " -> Seq Scan on tarifa (cost=0.00..44.66 rows=1573 > width=10)" > " Output: tarifa.consecutivo, tarifa.avaluo_inicial, > tarifa.avaluo_final, tarifa.destino_economico, tarifa.tipo_predio, > tarifa.tarifa, tarifa.estado, tarifa.area_construida_inicial, > tarifa.area_construida_final, tarifa.area_terreno_inicial, > tarifa.area_terreno_final, tarifa.estrato, tarifa.tipo, > tarifa.fecha_cambio, tarifa.registrado_por, tarifa.fecha_creacion, > tarifa.usuario_creacion, tarifa.vigencia, > tarifa.porcentaje_limite_incremento, tarifa.uso_predio" > " Filter: ((estado)::text = 'ACTIVO'::text)" > " -> Hash (cost=4.28..4.28 rows=228 width=8)" > " Output: caracteristica_predio_tarifa.tarifa, > caracteristica_predio_tarifa.caracteristica_predio" > " -> Seq Scan on caracteristica_predio_tarifa > (cost=0.00..4.28 rows=228 width=8)" > " Output: caracteristica_predio_tarifa.tarifa, > caracteristica_predio_tarifa.caracteristica_predio" > > > Que puedo hacer para que la consulta sea más rápida? > > -- > Éxitos. > > Cordialmente, > > > *William Diaz Pabón* > > *, Especialista en Soluciones Informáticas* > > Bogotá, Colombia > Tel: +57 (300) 3917774 > > http://planetapleno.blogspot.com/ > http://tutorialestecnicos.blogspot.com/ > -- Raul Andres Gutierrez Alejo
