Re: Consulta Eficiente

From: "Silvio Quadri" <silvioq(at)gmail(dot)com>
To: "Rafa Comino" <rafacomino(at)gmail(dot)com>, pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Consulta Eficiente
Date: 2008-10-17 12:56:20
Message-ID: 61dc71dc0810170556o6acb10d2qa706434a3c98fcd5@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

El 17 de octubre de 2008 9:47, Rafa Comino <rafacomino(at)gmail(dot)com> escribió:

> En primer lugar, gracias por vuestra atenció y consejos, En segundo os
> comento como está la cosa:
> Si meto el vacuum dentro del procedimiento, lo ejecturará dentro de la
> transacción con lo que esta se hará mas grande aún y tardará mas ¿no creeis?
> Respecto a lo de no borrar las filas, he de borrarlas, porque la tabla
> tiene muchos registros y si no las borro llegará a tener muchos millones de
> filas.
> Por ahora, la solución que he encontrado es separar la función en dos, en
> una hago el borrado de filas y el otro hago los cálculos y consultas que
> necesito,
> Aún así me está yendo lento,porque despues de borrar he dejado 200.000
> filas a procesar como resultado del cursor que comenté, y ya llevo mas de 4
> horas y aun no ha acabado de procesarlas.
> Lo que me sorprende que en procesar 200.000 filas 1 a 1 en un cursor
> (dentro del cursor hago una consulta a traves de la llave primaria y el
> delete de 1 linea) y la posterior consulta tarde tanto, tampoco
> son tantos registros como para tardar tanto tiempo en ejecutarse ¿no?
> (además la máquina está bien, es una buena máquina, no le faltan recursos,
> los indices los he repasado mil veces).
> Probablemente debería hacer un vacuum despues de borrar las 500.000 filas a
> ver si mejora el rendimiento,pero no lo veo claro...., no creo que sea la
> solución definitiva
>

En el mail mío ponía que el vacuum había que hacerlo después, no dentro del
procedimiento.
DEFINITIVAMENTE deberías hacer un vacuum despues de borrar las 500.000
filas.

Hacé el vacuum y volvé a ejecutar la función. ¿Probaste en hacer un for ....
select .... loop en vez de un cursor?

Pongo la respuesta en la lista.
Silvio

>
>
>
>
> 2008/10/17 Silvio Quadri <silvioq(at)gmail(dot)com>
>
>
>>
>> El 17 de octubre de 2008 4:32, Rafael Comino Mateos <ccomino(at)kaplan(dot)es>escribió:
>>
>> Tengo una función que al ejecutarse debe trabajar con un conjunto de
>>> 1.000.000 de registros aproximadamente.
>>>
>>> Sobre ese conjunto de datos, en un cursor saco una a una las filas y la
>>> mayoría las borro y otras pues las guardo en una tabla, o hago cálculos,
>>> etc.
>>>
>>> El problema que tengo es de eficiencia, ya que la transacción se hace tan
>>> grande que ocupa demasiada memoria y se hace lentísimo la ejecución.
>>>
>>> Que puedo hacer?
>>>
>>
>> ¿Es necesario que ejecutes todo en una transacción?
>> ¿Es necesario también tener un cursor?
>> Yo he ejecutado cosas similares con plpgsql y no tuve inconvenientes ...
>>
>> Después de ejecutar muchos "delete"s sobre la tabla ¿Hacés el vacuum?
>> Quizás ejecuciones anteriores que no efectuaron el vacuum correspondiente
>> estén afectando la performance.
>>
>> Saludos!
>> Silvio
>>
>>
>>
>>
>

--
Silvio Quadri

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message postgres Emanuel CALVO FRANCO 2008-10-17 13:08:05 Re: Consulta Eficiente
Previous Message Gilberto Castillo Martínez 2008-10-17 12:31:35 Re: para que sirven los esquemas??????