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.
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). |