RE: Consulta Eficiente

From: Edwin Quijada <listas_quijada(at)hotmail(dot)com>
To: Silvio Quadri <silvioq(at)gmail(dot)com>, Rafa Comino <rafacomino(at)gmail(dot)com>, <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: RE: Consulta Eficiente
Date: 2008-10-17 16:28:38
Message-ID: BLU137-W403E35CAF9FD9232F73A23E3320@phx.gbl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda


Lo que veo es que estas procesando secuencialmente y eso como sea va a durar y mucho. Creo que tienes que replantear el asunto y no ser tan procedimental. Como sea que lo uses 1,000,000 es mucho para hacerlo de una forma secuencial.
Seguro eres un programador de algun lenguaje procedimental como C , Pascal, como me dijo Alavaro una vez, debes pesar mas en SQL creo que ese es el problema. Por ejemplo para borrar esas tuplas no puedes hacer un simple delete dada una condicion o sacar solo lo que necesitas mediante SQL ?
La verdad es que secuencial te va a durar aunque le pongas 1000 petas de memoria al server.
Replantea lo que esta haciedno

*-------------------------------------------------------*
*-Edwin Quijada
*-Developer DataBase
*-JQ Microsistemas
*-809-849-8087
* " Si deseas lograr cosas excepcionales debes de hacer cosas fuera de lo comun"
*-------------------------------------------------------*

________________________________

Date: Fri, 17 Oct 2008 09:56:20 -0300
From: silvioq(at)gmail(dot)com
To: rafacomino(at)gmail(dot)com; pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: [pgsql-es-ayuda] Consulta Eficiente

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

_________________________________________________________________
Got Game? Win Prizes in the Windows Live Hotmail Mobile Summer Games Trivia Contest
http://www.gowindowslive.com/summergames?ocid=TXT_TAGHM

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message postgres Emanuel CALVO FRANCO 2008-10-17 16:40:59 Re: eroor # integer
Previous Message GRUPO SIC, S.A. DE C.V. 2008-10-17 16:26:36 RE: eroor # integer