Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 24-11-2005
Avatar de RONPABLO
[RONPABLO] RONPABLO is offline
Miembro Premium
 
Registrado: oct 2004
Posts: 1.514
Poder: 21
RONPABLO Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 24-11-2005
Avatar de aom
aom aom is offline
Miembro
 
Registrado: may 2003
Ubicación: Barcelona
Posts: 106
Poder: 22
aom Va por buen camino
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
__________________
Más se perdió en la guerra... y volvieron cantando
Responder Con Cita
  #3  
Antiguo 24-11-2005
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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.
Responder Con Cita
  #4  
Antiguo 24-11-2005
Avatar de RONPABLO
[RONPABLO] RONPABLO is offline
Miembro Premium
 
Registrado: oct 2004
Posts: 1.514
Poder: 21
RONPABLO Va por buen camino
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
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 01:13:45.


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
Copyright 1996-2007 Club Delphi