RE: Rendimiento sin COMMIT

From: "Juan Carlos Barranco de Paz" <jcb(at)greccosoft(dot)es>
To: <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: RE: Rendimiento sin COMMIT
Date: 2008-06-13 12:56:50
Message-ID: 004d01c8cd54$f2aed470$d80c7d50$@es
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda


<jcb(at)greccosoft(dot)es> escribió:
> Hola, despues de darme bastantes porrazos intentando hacer un commit en
> pl/pgsql, veo que ya se ha hablado bastante y veo que no se puede.

>No te sientas solo, yo también invertí tiempo en eso inútilmente. Cada
>llamado a pl es una transacción en sí.

>
> Tengo un proceso en pl/pgsql que me crea 4 tablas de datos, de estas 2 de
> ellas pueden tener unos 6 millones de registros cada una

>Si no tienen constraints, todo bien. De todas formas, no creo que sea
>una buena idea crear tablas dentro de un sp..

> y posteriormente
> tengo que leer datos de una de las grandes , utilizar una temporal y
> actualizar la otra apoyándome en esta temporal.
>
> Mi preguta es , si hasta que no ha terminado de hacer la función no hace
el
> commit, ¿Qué rendimiento tendrá?, ¿tiene estadísticas de esas tablas?,
> ¿utiliza los índices?

No, no utilizará las estadísticas. El motor va a pensar que las tablas
están vacías.

>
> ¿obtendria un mejor rendimiento creando funciones independientes para
crear
> cada tabla (y asi hacer el commit) y llamarlas una a una desde sql?

Definitivamente, sí.
En mi opinión, creo que lo mejor es
1) crear las tablas y llenarlas
2) commitear, vacuum analyze
3) correr la actualización desde tablas temporales de la que hablás.

Saludos,
Silvio

´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´
´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´
He probado en una función pl/pgsql haciendo un ANALYZE como me apunto Jaime
y tarda mas o menos igual que haciéndolo por separado desde SQL.

Pero quiero probar modificar mediante un cursor pero me esto volviendo loco
con la definición, no se donde esta mal :

CREATE OR REPLACE FUNCTION prueba_1(dw01 dw01conf)
RETURNS smallint AS
$BODY$
DECLARE
jcb cursor for select *
from dw21vent
where empresa = dw01.empresa
order by empresa,articulo,tiempo for update;

dw21 dw21vent%ROWTYPE;
......
BEGIN

OPEN jcb;

LOOP
FETCH jcb INTO dw21;
EXIT WHEN NOT FOUND;
..........
........
update dw21vent
set ult_compra = t.ult_compra
where CURRENT OF jcb;

END LOOP;

CLOSE jcb;

RETURN 1;
END;

Obtengo este error :

ERROR: error de sintaxis en o cerca de «OF»
LINE 1: update dw21vent set ult_compra = $1 where CURRENT OF $2
^
QUERY: update dw21vent set ult_compra = $1 where CURRENT OF $2
CONTEXT: SQL statement in PL/PgSQL function "prueba_1" near line 85

********** Error **********

ERROR: error de sintaxis en o cerca de «OF»
Estado SQL:42601
Contexto:SQL statement in PL/PgSQL function "prueba_1" near line 85

__________ Information from ESET NOD32 Antivirus, version of virus signature
database 3184 (20080613) __________

The message was checked by ESET NOD32 Antivirus.

http://www.eset.com

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Alvaro Herrera 2008-06-13 15:28:38 Re: Rendimiento sin COMMIT
Previous Message Silvio Quadri 2008-06-13 12:22:42 Re: Consulta teoria SQL (FK a dos tablas).