Ver Mensaje Individual
  #1  
Antiguo 24-11-2005
Avatar de RONPABLO
[RONPABLO] RONPABLO is offline
Miembro Premium
 
Registrado: oct 2004
Posts: 1.514
Reputación: 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