Почему следующий запрос такой плохой
-
22-10-2019 - |
Вопрос
После того, как спросил это Вопрос, я подумал о том, почему определенный запрос делал все проблемы.
Короче говоря, был запрос, который занял 500 мс, я запустил несколько планов выполнения и применил рекомендуемые индексы, но он сократил только около 50-60 мс.
После того, как я запустил его снова, я узнал, что следующий запрос (который встречается в нескольких местах) был действительно медленным:
SELECT @TempCardNumber = CardNumber
FROM Cards
WHERE (CardNumber=@CardNumber or FullCardNumber=@CardNumber)
Когда я изменил это на
SELECT @TempCardNumber = CardNumber
FROM Cards
WHERE (CardNumber=@CardNumber)
Он работал очень быстро, и даже удаление индексов не имело большого значения, что заставило меня поверить, что это было главное узкое место, но я не понимаю ... что в этом не так?
Решение
OR
Обычно не «сертируется», когда вы используете разные столбцы
То есть, случай вы можете оптимизировать для поиска Sknumber или Fullcardnumber с индексом на каждом столбце, но не в обоих столбцах. Это «поиск».
Индекс на оба столбцы не будут работать, потому что вы OR
: Значения для каждой строки должны быть проверены. Это сканирование.
Если условие было AND
, SQL Server может сделать остаточный поиск на FullCardnumber после Findng CardNumber. Ищите в основном вторичный поиск.
В любом случае, попробуйте это, чтобы удалить OR
сканировать и иметь 2 индивидуальных эффективных поиска
SELECT
@TempCardNumber = CardNumber
FROM
(
SELECT CardNumber
FROM Cards
WHERE CardNumber = @CardNumber
UNION -- removed dupes
SELECT CardNumber
FROM Cards
WHERE FullCardNumber = @CardNumber
) X
Обратите внимание, что запрос предполагает, что вы получите только одну ряд: это задумано?