Вопрос

После того, как спросил это Вопрос, я подумал о том, почему определенный запрос делал все проблемы.

Короче говоря, был запрос, который занял 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

Обратите внимание, что запрос предполагает, что вы получите только одну ряд: это задумано?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с dba.stackexchange
scroll top