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

Alvaro Herrera alvherre@dcc.uchile.cl
Mon, 19 Jan 2004 17:34:21 -0300


----- Forwarded message from Carmen Gloria Sepulveda Dedes <csepulveda@atichile.com> -----

Date: Mon, 19 Jan 2004 15:30:30 -0300
From: Carmen Gloria Sepulveda Dedes <csepulveda@atichile.com>
Organization: ATI Chile
X-Mailer: Mozilla 4.78 [en] (X11; U; SunOS 5.9 sun4u)
To: Alvaro Herrera <alvherre@dcc.uchile.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)