Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Consulta anidada muy lenta

Estas en el tema de Consulta anidada muy lenta en el foro de SQL Server en Foros del Web. Buenas tardes, Lo primero es ir al grano, tengo una tabla principal con aproximadamente 8 millones de datos los cuales están por razones de negocio ...
  #1 (permalink)  
Antiguo 25/02/2013, 15:04
 
Fecha de Ingreso: febrero-2013
Mensajes: 1
Antigüedad: 11 años, 1 mes
Puntos: 0
Busqueda Consulta anidada muy lenta

Buenas tardes,
Lo primero es ir al grano, tengo una tabla principal con aproximadamente 8 millones de datos los cuales están por razones de negocio con mas de 50 columnas el problema es que se necesita una consulta para descartar datos no coincidentes, para explicarme mejor tengo algo así parecido.


Tabla datos

Código:
| Col1 | Col2 | Col3 | Col4 | Col5 | ....... | Col50
|   1  |   2  |  AX  |  JC   |  OT | ....... | Perez |
|   5  |   1  |  AX  |  HC   |  OT | ....... | Perez |
|   3  |   4  |  AC  |  PO   |  YT | ....... | Perez |
|   1  |   5  |  AT  |  BC   |  YP | ....... | Perez |
|  16  |   6  |  AU  |  BY   |  OT | ....... | Lopez|
|  21  |   2  |  BX  |  CC   |  IT | ....... | Lopez|
|  10  |   9  |  AX  |  HC   |  YT | ....... | Lopez|
.
.
.
Tengo una serie de datos con las mismas columnas anteriores con las que quiero eliminar las que no corresponden a la lista previa que tiene muchos datos y estoy realizando este query


Código:
Select d.* from Datos d
LEFT OUTER JOIN TablaCol1 tc1 on tc1.Col1 = d.Col1
LEFT OUTER JOIN TablaCol1 tc2 on tc1.Col2 = d.Col2
LEFT OUTER JOIN TablaCol1 tc3 on tc1.Col3 = d.Col3
LEFT OUTER JOIN TablaCol1 tc4 on tc1.Col4 = d.Col4
LEFT OUTER JOIN TablaCol1 tc5 on tc1.Col5 = d.Col5
......
LEFT OUTER JOIN TablaCol1 tc50 on tc1.Col50 = d.Col50
Where tc1.Col1 is null
   and tc2.Col2 is null
   and tc3.Col3 is null
   and tc4.Col4 is null
   and tc5.Col5 is null
....
   and tc50.Col50 is null
Como se peude observar al realizar este tipo de consulta se crean muchas anidaciones el problema es que al ser tantos datos se demora demasiado al realizar esta consulta no se si se pueda replantear esta consulta de una manera mas eficaz agradezco quien pueda quemar un poco de tiempo en esto gracias.
  #2 (permalink)  
Antiguo 25/02/2013, 15:45
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 7 meses
Puntos: 774
Respuesta: Consulta anidada muy lenta

quitale el outer en lugar usa left join o inner join, revisala con el analizador de consultas, que indices tienen tus tablas??
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 26/02/2013, 02:36
 
Fecha de Ingreso: julio-2012
Ubicación: Israel
Mensajes: 360
Antigüedad: 11 años, 9 meses
Puntos: 40
Respuesta: Consulta anidada muy lenta

1. Libtas: Me parece que no hay diferencia entre Left Outer Join y Left Join.

2. En lugar de
Left Join TablaCol1 On ... Where ... Is Null
mejor utilizar Not Exists (en este caso):
Where Not Exists (Select 1 From TablaCol1 tc1 Where tc1.Col1=d.Col1).

3. ¿Estas seguro que entre las condiciones de la clausula Where hay "And" y no "Or"?
El "And" significa que todos los cincuenta códigos deben ser "huerfanos".

4. Supongo que las columnas col1..col50 en ambas tablas no estan indexadas (50 indices en cada tabla..).
La tarea con dos tablas de millones de filas y más de cincuenta columnas es muy pesada.
Yo intentaría utilizar un bucle y enviar cada vez los ID de los códigos que existen en TablaCol1 a una tabla temporal, para encontrar posteriormente los que faltan.
__________________
El Castellano no es mi lengua materna: discúlpenme por los errores gramaticales.
Mi blog

Etiquetas: anidadas, referencias, server, sql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:32.