Мы пытаемся оптимизировать некоторые из наших запросов.Зачем использовать временную таблицу быстрее, чем вложенный запрос?
Один запроса, выполнив следующие действия:
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, за исключением %.
Очевидно, что при использовании двух запросов стоимость сортировки Top N намного выше во втором запросе, чем стоимость метода Сортировка в подзапросе, поэтому трудно прямое сравнение затрат.
Все, что я вижу из планов, будет указывать на то, что метод подзапроса будет быстрее.
Вы сравнили планы запросов? – Oded
@Однако, см. Мое редактирование. –
Вы очистили кеш данных между каждым тестом? Если нет, это может исказить ваше сравнение. – AdaTheDev