Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Mejorar velocidad de un SQL al consultar muchos datos. (https://www.clubdelphi.com/foros/showthread.php?t=27557)

RONPABLO 24-11-2005 07:49:47

Mejorar velocidad de un SQL al consultar muchos datos.
 
Cordial saludo, tengo que validar un grupo de registros de forma periodica en una aplicación, estos registros estan de un rango de 10.000 a 13.000 registros en cada actualización, donde facilmente puede que se encuentren tansolo 20 o 30 registros diferentes, por ejemplo:

Tengo en una base de datos (Firebird 1.5) una tabla con 12.000 registros y hoy me pasan un archivo de una hoja de calculo con 9.000, eso quiere decir que estos ultimos 9.000 registros estan validados para el periodo de tiempo que comprende hoy hasta la proxima actulización, de forma tal que los que no estan en estos 9.000 registros no se pueden borrar de la base de datos, pero tampoco podran ser tomados en cuenta durante el periodo de tiempo determinado, ademas facilmente dentro de estos 9.000 se puede encontrar registros que no esten en la base de datos y por ende se deberan ingresar dentro de ella. Todo esto ya lo estoy haciendo pero es un proceso muy largo (en ocaciones pasa de 30 min).

Para mejorar la velocidad se me ocurrio guardar los registros que estan en la hoja de calculo en una tabla y posteriormente hacer una SQL, y es aquí donde aunqe se mejora la velocidad a la mita (15 min) sigue siendo muy demorado, como tal hago el siguente update:

Código SQL [-]
 update TANAMNESIS a set a.FECHA_AUTORIZADA = cast('now' as date)
 wherea.IDANAMNESIS_TEXTO not in 
 (select t.IDANAMNESIS_TEXTO from TTEMPORAL t)

donde TANAMNESIS y TTEMPORAL tien un poco mas o un poco menos de 12.000 registros, a esto quedaria faltando insertar los datos nuevos que estan en TTEMPORAL, para esto pienso hacer un Procedimiento almacenado paresido a lo siguiente:


Código SQL [-]
 for select IDANAMNESIS_TEXTO, campo1, campo2 FROM TTEMPORAL a 
  where a.IDANAMNESIS_TEXTO not in 
 (select t.IDANAMNESIS_TEXTO from TANAMNESIS t) 
 into :IDANAMNESIS_TEXTO, :campo1, :campo2 do
 begin
    insert into ....
 end

Pero tendria el mismo problema de velocidad y quedaria tal cual como inice (con un proceso de 30 min).

Mi pregunta es si existe una forma optima de hacer lo que yo quiero, lo que he notado es que la sub-consulta demora tremendamente el proceso.

De antemano muchas gracia por su ayuda.

aom 24-11-2005 09:16:23

Hola,
prueba con esto :

update TANAMNESIS a set a.FECHA_AUTORIZADA = cast('now' as date)
where not exists
(select * from temporal t where t.IDANAMNESIS_TEXTO=a.idanamnesis_texto)

Saludos

Casimiro Notevi 24-11-2005 09:37:40

Cita:

Empezado por aom
Hola,
prueba con esto :

update TANAMNESIS a set a.FECHA_AUTORIZADA = cast('now' as date)
where not exists
(select * from temporal t where t.IDANAMNESIS_TEXTO=a.idanamnesis_texto)

Saludos

No sé cómo irá esa consulta, pero si quitas el asterisco (*) y pones sólamente el campo necesario, ganarás mucho.

RONPABLO 24-11-2005 18:10:02

Ya lo solucione, y me da pena decir como... pero bueno... todo radicaba en que no tenia indices en ninguna de las dos tablas, y lo arregle colocando IDANAMNESIS_TEXTO como indice en las dos tablas:

Nota:
Tambien probe con pero sin los indices seguia igual de lento
Código SQL [-]
   update TANAMNESIS a set a.FECHA_AUTORIZADA = cast('now' as date)
   where not exists 
    (select * from temporal t where   t.IDANAMNESIS_TEXTO=a.idanamnesis_texto)

Muchas gracias por sus respuestas


La franja horaria es GMT +2. Ahora son las 22:35:46.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi