Tengo algunas identificaciones insertado en una tabla temporal #A
de la siguiente manera:Dos consultas. Misma salida. Uno tarda 2 horas y el otro 0 segundos. ¿Por qué?
SELECT DISTINCT ID
INTO #A
FROM LocalDB.dbo.LocalTable1
WHERE ID NOT IN (SELECT DISTINCT ID FROM LocalDB.dbo.LocalTable2)
GO
CREATE INDEX TT ON #A(ID)
GO
Estoy tratando de obtener alguna información de un servidor vinculado remoto utilizando los identificadores que se reunieron en la etapa anterior:
de consultas 1:
SELECT ID, Desc
FROM RemoteLinkedServer.DB.dbo.RemoteTable X
WHERE ID IN (SELECT ID FROM #A)
consulta 2:
SELECT ID, Desc
FROM RemoteLinkedServer.DB.dbo.RemoteTable X
INNER JOIN #A Y
ON X.ID = Y.ID
Ahora en la siguiente consulta, lo que estoy haciendo es obtener el resultado de la tabla temporal, copiar las filas y formatearlas adecuadamente en una lista separada por comas y ponerla manualmente en la consulta.
Consulta 3:
SELECT ID, Desc
FROM RemoteLinkedServer.DB.dbo.RemoteTable X
WHERE ID IN (-- Put all identifiers here --)
consultas 1
y 2
toma 2 horas para ejecutar y consulta 3
toma 0 segundos (mi tabla temporal contiene alrededor de 200 filas). No sé lo que está pasando y no tengo permisos para verificar si el servidor remoto tiene los índices relevantes en el ID, pero es simplemente desconcertante ver que una consulta construida manualmente se ejecuta en un momento que indica que hay algo que está yendo mal en la fase de optimización de consultas.
¿Alguna idea sobre qué está pasando mal aquí o cómo podría acelerar mi consulta?
+1 Honestamente, no sabía eso! Gracias por la aclaración. Entonces, ¿cómo envío mis valores locales al servidor vinculado remoto y obtengo los resultados? 'CURSOR's y luego enviar un identificador a la vez? La tabla remota es enorme, con alrededor de 10 millones de filas. – Legend
Probablemente su mejor opción sea construir dinámicamente el sql para ejecutar contra el servidor remoto y simplemente ejecutarlo.Descubrimos que este método es mucho más rápido para cada tipo de llamada que hacemos a los servidores vinculados. Usar un cursor y ejecutar una consulta a la vez puede hacer que aciertes los límites de velocidad de transacción; que puede que no quieras – NotMe
Gracias por la sugerencia. Ya no hay más cuellos de botella y mi script está funcionando bien con esta optimización. – Legend