У меня есть запрос, который я хочу выполнить как можно быстрее.
Вот оно:
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 тыс. Строк.
Есть идеи?
Может быть, я получаю испорченные результаты из-за кэширования, но я не знаю, так ли это или как сбросить кэширование.
EDIT:
Хорошо, я гуглил, как очистить кеш запросов, поэтому перед запросами добавил следующее:
DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE
Затем я выполнил каждый запрос 5 раз, и первый запрос был еще немного быстрее (13%).
1-й запрос: клиент Время обработки: 239,4
2-й запрос: клиент Время обработки: 290
Так что я думаю, вопрос в том, почему вы так думаете? Может быть, когда таблица увеличится в четыре раза, второй запрос будет быстрее? Или левое соединение приводит к тому, что запрос дважды попадает в индекс, поэтому он всегда будет медленнее.
Пожалуйста, не зажигайте меня, я просто пытаюсь получить образование.
РЕДАКТИРОВАТЬ # 2:
Мне нужно получить все InvoiceDetails, а не только скорректированные, следовательно, левое соединение.
РЕДАКТИРОВАТЬ # 3:
Реальная проблема, которую я пытаюсь решить с помощью запроса, заключается в суммировании всех строк InvoiceDetail, но в то же время и их корректировке. В конечном счете, кажется, что лучший запрос для выполнения - следующий. Я думал, что объединение, а затем добавление объединенной таблицы будет единственным способом, но кажется, что группировка по условию решает проблему наиболее элегантно.
SELECT CASE WHEN AdjustDetailId IS NULL THEN InvoiceDetailId ELSE AdjustDetailId END AS InvoiceDetailId
,SUM(Fee + FeeTax) AS Fee
FROM dbo.InvoiceDetail d
GROUP BY CASE WHEN AdjustDetailId IS NULL THEN InvoiceDetailId ELSE AdjustDetailId END
Пример: со следующими строками
InvoiceDetailID | Стоимость | FeeTax | AdjustDetailId
1 | 300 | 0 | NULL
2 | -100 | 0 | 1
3 | -50 | 0 | 1
4 | 250 | 0 | NULL
Мое желание было получить следующее:
InvoiceDetailID | Плата
1 | 150
4 | 250
Спасибо всем за ваш вклад.