From: | Alvaro Herrera <alvherre(at)commandprompt(dot)com> |
---|---|
To: | Gabriel Ferro <gabrielrferro(at)yahoo(dot)com(dot)ar> |
Cc: | pgsql-es-ayuda(at)postgresql(dot)org |
Subject: | Re: Desencriptar Registros y pasar a otra |
Date: | 2007-02-20 14:45:59 |
Message-ID: | 20070220144559.GE4217@alvh.no-ip.org |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
Gabriel Ferro escribió:
Algunos comentarios
> $gsm$
> BEGIN
> EXECUTE 'SELECT 1 FROM '||quote_ident($1) ||' WHERE '
> ||quote_ident($2)||' LIKE \''||$3||'\' FOR UPDATE NOWAIT';
> RETURN FALSE;
> EXCEPTION WHEN lock_not_available THEN
> RETURN true;
> END;
> $gsm$;
Lo que estas haciendo aqui es muy mala idea: estas haciendo un SELECT
FOR UPDATE de *cada uno* de los registros de la tabla. Si la tabla es
grande, se demorara bastante, ademas de generar un registro WAL para
cada tupla en la tabla, y *ademas* tendra que escribir en cada registro.
Si quieres bloquear una tabla completa, usa LOCK TABLE, el cual tambien
tiene una variante NOWAIT. *NO USES* select for update en este caso
porque el rendimiento necesariamente es muy malo.
> execute 'DELETE FROM "RecibidasDes" where "Sumario" IN (SELECT "Sumario" FROM "Recibidas" WHERE "Sumario" LIKE \''||Depta||'%\');';
Esto se puede hacer sin el EXECUTE, y sin el IN.
> execute 'INSERT INTO "RecibidasDes" SELECT "Sumario", "TipoInfo",ByteaText(decrypt("Info",\''||a||'\',\'bf\')) FROM "Recibidas" WHERE "Sumario" LIKE \''||Depta||'%\';';
Esto tambien se puede hacer sin execute, y creo que con menos cochinada
de comillas.
--
Alvaro Herrera http://www.CommandPrompt.com/
PostgreSQL Replication, Consulting, Custom Development, 24x7 support
From | Date | Subject | |
---|---|---|---|
Next Message | Alvaro Herrera | 2007-02-20 14:47:07 | Re: OT a quien se deb pedir que se agregue pgsql-es-ayuda a news.postgresql.org |
Previous Message | Mario | 2007-02-20 14:41:24 | Fwd: Desencriptar Registros y pasar a otra |