Назад | Перейти на главную страницу

LEFT JOIN Server Performance Оптимизация производительности

У меня есть запрос, который я хочу выполнить как можно быстрее.

Вот:

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. В противном случае системе потребуется выполнить поиск, чтобы получить эти данные, и система, вероятно, в конечном итоге выполнит сканирование, игнорируя ваш индекс.