TSQL-Какая разница между двумя запросами - PullRequest
1 голос
/ 20 октября 2010

У меня есть таблица со столбцом isprocessed бит ноль. Я создал индекс (не кластеризованный) для этого столбца. Перед применением индексного запроса

**`SELECT top 5000 * From Request Where IsProcessed Is Null`**

заняло от 30 до 40 секунд. Помните, что это очень огромная таблица со строками более 10 миллионов. Теперь после создания индекса по столбцу isprocessed тот же запрос не показал увеличения производительности.

Я попробовал другой запрос **

;With TopN As(SELECT Top 5000 * from Request Order By IsProcessed)
SELECT * From TopN Where IsProcessed Is Null

** Теперь этот запрос suprizingley дает результат менее чем за 2 секунды Интересно, почему есть разница в двух запросах? Также каково поведение при индексировании для битовых нулевых столбцов

Ответы [ 2 ]

1 голос
/ 20 октября 2010

Включите «Показать фактический план выполнения», чтобы увидеть, какие индексы используются в каждом случае.

Если вы создадите индекс для столбца с низкой селективностью (например, битовое поле), оптимизатор будетвероятно, не используйте его (это зависит).

Если у вас есть битовый столбец «IsProcessed» и в нем установлено менее 10% строк, и вы ищете их, то индекс может быть использован,Принимая во внимание, что если у вас есть индекс для поля с двумя состояниями, такого как пол ('M', 'F') со значениями примерно 50% / 50%, то маловероятно, что оптимизатор будет использовать этот индекс.

0 голосов
/ 20 октября 2010

Во втором запросе сначала будут выбраны первые 500, а затем будет применено предложение where, где в первом запросе сначала будет применено предложение where, а затем верхние 5000

.

Взгляните на SQL SERVER - Этапы обработки логических запросов - Порядок выполнения операторов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...