El 17 de octubre de 2008 9:47, Rafa Comino <[EMAIL PROTECTED]> 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 <[EMAIL PROTECTED]>
>
>
>>
>> El 17 de octubre de 2008 4:32, Rafael Comino Mateos <[EMAIL 
>> PROTECTED]>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

Responder a