Estamos tratando de optimizar algunas de nuestras consultas.¿Por qué usar una tabla temporal sería más rápido que una consulta anidada?
Una consulta está haciendo lo siguiente:
SELECT t.TaskID, t.Name as Task, '' as Tracker, t.ClientID, (<complex subquery>) Date,
INTO [#Gadget]
FROM task t
SELECT TOP 500 TaskID, Task, Tracker, ClientID, dbo.GetClientDisplayName(ClientID) as Client
FROM [#Gadget]
order by CASE WHEN Date IS NULL THEN 1 ELSE 0 END , Date ASC
DROP TABLE [#Gadget]
(He quitado el complejo subconsulta no creo que sea relevante que no sea para explicar por qué esta consulta se ha realizado como un proceso de dos etapas.).
I pensaron que sería mucho más eficiente para combinar esto abajo en una sola consulta usando subconsultas como:
SELECT TOP 500 TaskID, Task, Tracker, ClientID, dbo.GetClientDisplayName(ClientID)
FROM
(
SELECT t.TaskID, t.Name as Task, '' as Tracker, t.ClientID, (<complex subquery>) Date,
FROM task t
) as sub
order by CASE WHEN Date IS NULL THEN 1 ELSE 0 END , Date ASC
Esto le daría al optimizador una mejor información para resolver lo que estaba pasando y evitar tablas temporales. Supuse que debería ser más rápido.
Pero resulta que es mucho más lento. 8 segundos frente a menos de 5 segundos.
No puedo entender por qué este sería el caso, ya que todo mi conocimiento de las bases de datos implica que las subconsultas siempre serán más rápidas que el uso de tablas temporales.
¿Qué me estoy perdiendo?
Editar -
Por lo que he podido ver en los planes de consulta, ambos son prácticamente idénticos, a excepción de la tabla temporal que tiene una operación extra "Insertar tabla" con un coste de 18 %
Obviamente, como tiene dos consultas, el costo de Sort Top N es mucho más alto en la segunda consulta que el costo del método Ordenar en la subconsulta, por lo que es difícil hacer una comparación directa de los costos.
Todo lo que puedo ver en los planes indica que el método de subconsulta sería más rápido.
¿Ha comparado planes de consulta? – Oded
@Oded, mira mi edición. –
¿Borró la memoria caché de datos entre cada prueba? Si no, eso podría sesgar tu comparación – AdaTheDev