[Pgsql-ayuda] [csepulveda@atichile.com: Consulta por Performance]

From: Alvaro Herrera <alvherre(at)dcc(dot)uchile(dot)cl>
To: pgsql-ayuda(at)tlali(dot)iztacala(dot)unam(dot)mx
Subject: [Pgsql-ayuda] [csepulveda@atichile.com: Consulta por Performance]
Date: 2004-01-19 20:34:21
Message-ID: 20040119203421.GA15142@dcc.uchile.cl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

----- Forwarded message from Carmen Gloria Sepulveda Dedes <csepulveda(at)atichile(dot)com> -----

Date: Mon, 19 Jan 2004 15:30:30 -0300
From: Carmen Gloria Sepulveda Dedes <csepulveda(at)atichile(dot)com>
Organization: ATI Chile
X-Mailer: Mozilla 4.78 [en] (X11; U; SunOS 5.9 sun4u)
To: Alvaro Herrera <alvherre(at)dcc(dot)uchile(dot)cl>
Subject: Consulta por Performance
X-BayesSpamScore: 0

Hola.

Disculpa que te moleste, pero tengo problemas para envia correos a la
lista. Es posible que envies esta pregunta por mi?, por favor.

Saludos y muchas gracias.

CG

*************
Hola a todos.

Me gustaria saber cual de estas formas de insert data debiera ser
mas eficiente en postgres.

Alternativa 1:
INSERT INTO <INSERT_TABLE>
SELECT <C1>, <C2> ...
FROM <TABLE1>
WHERE <COND1> AND
NOT EXISTS (SELECT <C3>
FROM <TABLE3>
WHERE <COND3>)

o,
Alternativa 2:
FOR <RECORD> IN SELECT <C1>, <C2> ...
FROM <TABLE1>
WHERE <COND1> AND
NOT EXISTS (SELECT <C3>
FROM <TABLE3>
WHERE <COND3>)
LOOP
INSERT INTO <INSERT_TABLE>
VALUES (<RECORD.C1>, <RECORD.C2> ...)
END LOOP;

o bien,
Alternativa 3:
OPEN <cursor> FOR SELECT <C1>, <C2> ...
FROM <TABLE1>
WHERE <COND1> AND
NOT EXISTS (SELECT <C3>
FROM <TABLE3>
WHERE <COND3>)
LOOP
FETCH <cursor> INTO <v1>, <v2> ...
EXIT WHEN NOT FOUND;
INSERT INTO <INSERT_TABLE>
VALUES (<v1>, <v2> ...)
END LOOP;
CLOSE <cursor>;

El select correspondiente al insert es identico al select del cursor.
Se asume que el select anidado esta correctamente "joineado" con el
superior.

Mi problema es que tengo una funcion que entre otras cosas hace lo
descrito arriba para llevar datos de una tabla a otra. Son aprox.
220.000 registros los que debieran insertarse, pero se esta demorando
demasiado tiempo (en tres horas no ha insertado aun 100.000 registros).

Siguiendo los logs, observe que a medida que va aumentado la cantidad
de registros se va poniendo cada vez mas lento.

La maquina es una Penguin Computing Altus 3200 64 bits, disco SCSI
con 2 Gb de RAM. Tengo los sgtes. valores para parametros:

checkpoint_segments | 100
checkpoint_timeout | 300
checkpoint_warning | 300
shared_buffers | 1000

No se si otro sera importante.

Saludos y muchas gracias por sus comentarios.
CG

----- End forwarded message -----

--
Alvaro Herrera (<alvherre[a]dcc.uchile.cl>)
"Cuando mañana llegue pelearemos segun lo que mañana exija" (Mowgli)

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Pablo Mejias D. 2004-01-19 20:39:51 [Pgsql-ayuda] Ayuda
Previous Message Roberto Andrade Fonseca 2004-01-19 18:15:18 Re: [Pgsql-ayuda] Ayuda