Hola Gilberto.
Espero que mis comentarios ayuden a resolver tu necesidad.
Para comenzar, una de las cosas más pesadas para cualquier BD es el UPDATE,
así que no te preocupes.
Si es más rápido: "SUBSTR(id,1,2)='99'" que "id LIKE '99%'" por milésimas de
segundo. Mejora pero no es de gran ayuda a tu problema.
Algo mas útil sería algo así "id_ini=99". Es decir agregar un campo adicional
donde guardes los primeros dos dígitos en valor numérico, y además agregarle un
índice a este campo.
Pero es algo que tendrás que ver con tu DBA y con tus compañeros de
programación (Si es que existen).
Otra cosa es el comparar "nom_cli='UN VALOR ALFANUMÉRICO'".
Si puedes y tienes, sería mejor comparar "id_cli=77594830". Es más rápido un
filtro por número, que por alfanumérico.
Si no tienes un ID para CLIENTE, entonces agrega un índice a NOM_CLI para que
la búsqueda sea más rápida.
Otra cosa sería el orden del WHERE, escribe los filtros de menor a mayor tiempo
de consulta.
Es decir, al tanteometro cual filtro regresa más rápido el resultado:
"nom_cli='HOSTAL CABALLITO TOTORA'" ó "SUBSTR(id,1,2)='99'" , ese debe ir
primero.
Si logras crear el campo "id_ini" del tipo numérico y con índice, pon este
primero.
------------------
Si quieres algo extremo es crear una nueva tabla con los valores actualizados,
algo así: (Un INSERT es más rapido)
CREATE TABLE cat_lote_2 AS
SELECT campo1, campo2,
CASE WHEN SUBSTR(ID,1,2)='99' THEN '13'||SUBSTR(ID,2)
ELSE ID
END AS campo3,
campo4, campo5, etc....
FROM cat_lote;
(Lo anterior si aplica a tus necesidades)
Una vez creada esta tabla, le agregas sus índices y llaves primarias y
foráneas, y la renombras como la tabla correcta.
------------------
Otra cosa por experiencia es el espacio disponible en tu Disco Duro.
Por último y por mi experiencia, siento que ejecutar un lote de SQL es más
rápido desde PSQL que desde PgAdmin
Espero te pueda ayudar.
Saludos
Date: Mon, 25 Jun 2012 10:37:56 -0500
Subject: [pgsql-es-ayuda] ejecucion de sentencias update de manera mas veloz
From: [email protected]
To: [email protected]; [email protected];
[email protected]
Buen dia a todos
tengo una base de datos postgis que tienen la lotizacion de un poblado pues
resulta que cada fila de los lotes tiene el nombre del cliente pero no su
codigo para otras consultas administrativas que tenemos
en otro sistema alfanumerico
asi que exporte la lista de nombres y codigos del sistema transaccional en
oracle para insertarle ese codigo a postgres usando excel para armar la
consulta.
las consultas que genero en excel quedan asi:
UPDATE CAT_LOTE SET ID= '13010400060' WHERE NOM_CLI = 'HOSTAL CABALLITO TOTORA'
AND ID LIKE '99%';
UPDATE CAT_LOTE SET ID= '13010400070' WHERE NOM_CLI = 'ARCILA GONZALES MARGOT
IVONE' AND ID LIKE '99%';
UPDATE CAT_LOTE SET ID= '13010400080' WHERE NOM_CLI = 'LESCANO ALVA CARLOS
FORTUNATO' AND ID LIKE '99%';
UPDATE CAT_LOTE SET ID= '13010400090' WHERE NOM_CLI = 'ARCILLA CACERES MICAELA'
AND ID LIKE '99%';
UPDATE CAT_LOTE SET ID= '13010400100' WHERE NOM_CLI = 'ARCILLA JURADO ALBERTO'
AND ID LIKE '99%';
y asi hasta 200 mil
estas las pego en el pgadmin pero en bloques de 10000 porque si le pongo mas se
cuelga y demora una hora mas o menos en ejecutar esa actualizacion.
estoy usando postgres 9.1 sobre windows server 2003
alguna otra forma de hacer esto mas rapido usando el psql por consola no se
alguna otra forma como seria?
gracias por la atencion
saludos
--
José Mercedes Venegas Acevedo
cel: Mov. 949808846
mails: [email protected]
[email protected]
PHP Spanish Docs translator member.
http://www.php.net/manual/es/index.php