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: jvenegasp...@gmail.com
To: pgsql-es-ayuda@postgresql.org; pgsql-es-fome...@postgresql.org; 
ar...@postgresql.org

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: jvenegasp...@php.net
          jvenegasp...@gmail.com

 
PHP Spanish Docs translator member.
http://www.php.net/manual/es/index.php

                                          

Responder a