PostgreSQL - Query lento

 
Vista:

Query lento

Publicado por Jeff (3 intervenciones) el 21/04/2006 01:02:20
Hola amigos ojala alguien pueda guiarme con esta inquietud
resulta que tengo una consulta que trabaja perfecta sin clausulas en el where,
pero apenas le coloco en el where condiciones se me vuelve lenta.

no colocarle clausulas al where quiere decir que son todos.
y las clausulas que le coloco al where donde se me pone lenta es cuando le doy para todos y se vuelve lenta.
tengo esta misma consulta para mysql y me trabaja igual de rapido tanto con las condiciones del where como sin ellas, es por eso que no se que podra ser
esta es mi consulta:

select p.code_cta as auxiliar,c.clasedct,c.detalle as clase,p.deta_cta,d.document,d.fechadct,
rtrim(sum(totadebe)) as debito,rtrim(sum(totahabe)) as credito from plan_cta p, diario d,clasedct c
where d.auxiliar like rtrim(p.code_cta)||'%' and p.nive_cta='01' and c.clasedct=d.clasedct
and d.fechadct between '20050101' and '20050101'
and d.auxiliar >= ' ' and d.auxiliar<= '99999999999' //condicion lenta
and (d.clasedct||d.document) between ' ' and 'zzzzzzzzzzz' //condicion lenta
and d.nit >=' ' and d.nit <='99999999999' //condicion lenta
and p.agru_cta between ' ' and 'zzz'
group by p.code_cta,c.clasedct,c.detalle,p.deta_cta,d.document,d.fechadct
order by d.fechadct,c.clasedct,d.document,p.code_cta

de ante mano gracias

Pd. mis campos son tipo char (los que presenta problema)

gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Query lento

Publicado por Julio (334 intervenciones) el 21/04/2006 01:45:21
Tipo CHAR?, mmm... bueno, esta comprobado que los punteros apuntan a espacios de memoria muy grandes cuando se trata de campos de tipo cadena (varchar, char, text), debido a que cada caracter es un espacio reservado, debido a esto se debe tu lentitud

Has un EXPLAIN + tu_query

y revisa cuanto sale el costo del EXPLAIN si es mas de 3, es obvio que tu query es demasiado costoso.

Puedes crear indices a los campos, quizas sea una solución, otra que cambies tus tipos de datos de CHAR (para minimizar un poco la lentitud a VARCHAR) o a entero.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Query lento

Publicado por jeff (3 intervenciones) el 21/04/2006 16:17:56
este es el resultado del explain

Sort (cost=867.33..867.34 rows=1 width=143)
Sort Key: d.fechadct, c.clasedct, d.document, p.code_cta
-> HashAggregate (cost=867.30..867.32 rows=1 width=143)
-> Nested Loop (cost=0.00..867.28 rows=1 width=143)
-> Nested Loop (cost=0.00..861.44 rows=1 width=114)
Join Filter: ("outer".auxiliar ~~ (rtrim(("inner".code_cta)::text) || '%'::text))
-> Index Scan using diario5 on diario d (cost=0.00..8.57 rows=1 width=88)
Index Cond: ((fechadct >= '2005-01-01'::date) AND (fechadct <= '2005-01-01'::date) AND (auxiliar >= ' '::bpchar) AND (auxiliar <= '99999999999'::bpchar))
Filter: ((((clasedct)::text || (document)::text) >= ' '::text) AND (((clasedct)::text || (document)::text) <= 'zzzzzzzzzzz'::text) AND (nit >= ' '::bpchar) AND (nit <= '99999999999'::bpchar))
-> Seq Scan on plan_cta p (cost=0.00..852.73 rows=8 width=56)
Filter: ((nive_cta = '01'::bpchar) AND (agru_cta >= ' '::bpchar) AND (agru_cta <= 'zzz'::bpchar))
-> Index Scan using clasedct_clasedct on clasedct c (cost=0.00..5.82 rows=1 width=35)
Index Cond: (c.clasedct = "outer".clasedct)

me podrias aclarar un poco el uso de este comando , voy a tratar lo que me aconsejas y luego te cuento a ver como me va
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar