Мы пытаемся оптимизировать некоторые из наших запросов.
Один запрос выполняет следующие действия:
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]
(Я удалил сложный подзапрос. Не думаю, что он уместен, кроме как объяснить, почему этот запрос был выполнен в два этапа.)
Я думал было бы гораздо эффективнее объединить это в один запрос, используя подзапросы как:
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
Это даст оптимизатору лучшую информацию, чтобы понять, что происходит, и избежать любых временных таблиц. Я предположил, что это должно быть быстрее.
Но оказывается, что это намного медленнее. 8 секунд против 5 секунд.
Я не могу понять, почему это так, поскольку все мои знания баз данных подразумевают, что подзапросы всегда будут быстрее, чем использование временных таблиц.
Что мне не хватает?
Редактировать -
Из того, что я смог увидеть из планов запросов, оба в значительной степени идентичны, за исключением временной таблицы, в которой есть дополнительная операция «Вставка таблицы» со стоимостью 18%.
Очевидно, что при наличии двух запросов стоимость Sort Top N намного выше во втором запросе, чем стоимость Sort в методе подзапроса, поэтому сделать прямое сравнение затрат сложно.
Все, что я вижу по планам, будет означать, что метод подзапроса будет быстрее.