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