У меня есть запрос, который я хочу выполнить как можно быстрее.
Вот:
select d.InvoiceDetailId,a.Fee,a.FeeTax
from InvoiceDetail d
LEFT JOIN InvoiceDetail a on a.AdjustDetailId = d.InvoiceDetailId
Я помещаю возрастающий индекс в столбец AdjustDetailId
Затем я выполнил запрос с «Показать фактический план выполнения», и расчетная стоимость поддерева результата (за пределами самого верхнего узла выбора) составила 2,07.
Затем я подумал, может быть, я могу что-то улучшить, поэтому я добавил условное выражение к левому соединению, например:
select d.InvoiceDetailId,a.Fee,a.FeeTax
from InvoiceDetail d
LEFT JOIN InvoiceDetail a on a.AdjustDetailId is not null
and a.AdjustDetailId = d.InvoiceDetailId
Я повторил попытку и получил поддерево стоимостью 0,98. Так что я подумал: отлично, я сделал это вдвое быстрее. Затем я щелкнул «Показать статистику клиента», а затем щелкнул «Выполнить» 4–5 раз с обоими запросами и, верьте или нет, первый запрос в среднем оказался быстрее. Я не понимаю. Кстати, запрос возвращает 120 тыс. Строк.
Любое понимание?
Возможно, я получаю испорченные результаты из-за кеширования, но я не знаю, так ли это или как сбросить кеширование.
РЕДАКТИРОВАТЬ: Хорошо, я googledd, как очистить кеш запросов, поэтому я добавил следующее перед запросами:
DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE
Затем я запускал каждый запрос 5 раз, и первый запрос все еще был немного быстрее (13%). 1-й запрос: время обработки клиента: 239,4 2-й запрос: время обработки клиента: 290
Итак, я думаю, вопрос в том, почему вы так думаете? Может быть, когда таблица увеличится в четыре раза, второй запрос будет быстрее? Или левое соединение приводит к тому, что запрос дважды попадает в индекс, поэтому он всегда будет медленнее.
Пожалуйста, не раздражай меня, я просто пытаюсь получить образование.
Включите в индекс AdjustDetailID столбцы Fee и FeeTax. В противном случае системе потребуется выполнить поиск, чтобы получить эти данные, и система, вероятно, в конечном итоге выполнит сканирование, игнорируя ваш индекс.