Re: ayuda urgente!!

From: Fernando Romo <pop(at)cofradia(dot)org>
To: Viviana Sanchez <vsanchez(at)uncoma(dot)edu(dot)ar>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: ayuda urgente!!
Date: 2004-07-07 16:54:05
Message-ID: 40EC2AAD.6020506@cofradia.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Viviana:

Antes que nada, de vez en cuando dale un "analyze" a la base de datos
para que el optimizador de querys sea mas eficiente.

Ví que tienes una función max() en tu query, las funciones no son
optimizables, por lo cual tu query esta forzando una lectura lineal en
lugar de usar indices,

checa este artículo, te podra ser útil:

*Optimización de querys para bases de datos grandes en PostgreSQL
http://cofradia.org/modules.php?name=News&file=article&sid=4971

si aplicas un "*EXPLAIN ANALYZE*" veras que tu query esta leyendo
secuencialmente en lugar de optimizar indices, aunque el campo de
busqueda este indexado.

Tal vez lo que hace tu query es que manda una lectura secuencial por
cada registro que obtiene y esto, mientras mas crece la base, hace el
query mas lento.
*
Por otro lado, puedes sustituir Max() por algo así:

Select idpase order by idpase DESC limit 1;

si el campo idpase esta indexado, esto será miles de veces mas rápido
que la función Max().

Saludos... El Pop

Viviana Sanchez wrote:

> Hola:!!
>
> Estoy utilizando postgres 7.3 + apche + php el problema que tengo es que
> tengo una consulta y el tiempo de ejecucion de la misma es de 50
> segundos.
> ES MUCHO TIEMPO!!!!!!
>
> La consulta es la siguiente:
>
> $consulta="((select numero,anio,extension,tema,codusuario
> from e_expediente
> where coddependencia='$ladep' and
> estado='enviado')EXCEPT(select e.numero, e.anio,
> e.extension, e.tema, codusuario
> from e_expediente as e,e_pase as p
> where e.numero=p.numexp and
> e.anio=p.anioexp
> and
>
> e.extension=p.extexp)
> )
> UNION
> (select e.numero,e.anio,e.extension,e.tema,p.codusuarioo
> from e_expediente as e,e_pase as p
> where e.numero=p.numexp and
> e.anio=p.anioexp and
> e.extension=p.extexp and
> p.coddependencia='$ladep'
> and p.idpase IN (select max(idpase)
> from e_pase
> group by numexp,anioexp,extexp)
> );
>
> La cantidad de registros de la tabla e_expediente es 25.384 y la de la
> tabla e_pases es 6699
>
> Cuando inicialmente probe la consulta con 10 registros en cada tabla la
> ejecucion de la consulta ni se notaba. Igual si bien ahora tengo
> mucho mas
> registros NO SON MUCHOS.
>
> Quiero aclarar que los campos (numero, extension,anio) de la tabla
> expediente son clave y en la tabla tengo un indice sobre
> coddependencia. En la tabla pase la clave es: idpase y tengo indices
> sobre
> los campos (numexp,extexp,anioexp,coddep).
>
>
> POR FAVOR SI ALGUIEN ME PUEDE DAR UNA MANO DE QUE ES LO QUE ESTA
> PASANDO LO
> AGRADECERIA MUCHO.
>
> Desde ya muchas gracias!!!!!!!!
>
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 9: el optimizador ignorará el uso de recorridos de índice si los
> tipos de datos de las columnas no coinciden
>

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Johnny Gonzalez 2004-07-07 16:56:52 Como puedo ver las tablas que tiene una base de datos??
Previous Message Mario Soto 2004-07-07 16:37:47 Re: Recomendacion BD rapida