Планы SQL Server: разница между сканированием индекса и поиском индекса

87

В плане выполнения SQL Server в чем разница между сканированием индекса и поиском индекса

Я использую SQL Server 2005.

Синди
источник

Ответы:

128

Сканирование индекса - это когда SQL-сервер считывает весь индекс в поисках совпадений - время, необходимое для этого, пропорционально размеру индекса.

Поиск по индексу - это когда SQL-сервер использует структуру b-дерева индекса для прямого поиска совпадающих записей (см. Http://mattfleming.com/node/192, чтобы узнать, как это работает) - затраченное время пропорционально только количество совпадающих записей.

  • В общем, поиск по индексу предпочтительнее сканирования индекса (когда количество совпадающих записей предположительно намного меньше, чем общее количество записей), поскольку время, необходимое для выполнения поиска по индексу, постоянно, независимо от общего числа записей в вашем Таблица.
  • Однако обратите внимание, что в определенных ситуациях сканирование индекса может быть быстрее, чем поиск по индексу (иногда значительно быстрее) - обычно, когда таблица очень мала или когда большой процент записей соответствует предикату.
Джастин
источник
3
Ссылка еще активна? для меня это не работает. Пожалуйста, помогите, если есть обновленная ссылка
Ронак Агравал
2
@RonakAgrawal Похоже, что ссылка на самом деле мертва - может, вместо этого проверьте википедию ?
Джастин
76

Основное правило: сканирование - плохо, поиск - хорошо.

Индексное сканирование

Когда SQL Server выполняет сканирование, он загружает объект, который он хочет прочитать с диска, в память, а затем читает этот объект сверху вниз в поисках необходимых ему записей.

Поиск по индексу

Когда SQL Server выполняет поиск, он знает, где в индексе должны быть данные, поэтому он загружает индекс с диска, переходит непосредственно к той части индекса, которая ему нужна, и считывает туда, где заканчиваются нужные данные. . Очевидно, что это гораздо более эффективная операция, чем сканирование, поскольку SQL уже знает, где находятся данные, которые он ищет.


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

Когда SQL Server ищет ваши данные, вероятно, одна из самых важных вещей, которая заставит SQL Server переключиться с поиска на сканирование, - это когда некоторые из столбцов, которые вы ищете, не включены в индекс, который вы хотите использовать. Чаще всего в этом случае SQL Server возвращается к сканированию кластерного индекса, поскольку кластерный индекс содержит все столбцы в таблице. Это одна из основных причин (по крайней мере, на мой взгляд) того, что теперь у нас есть возможность ВКЛЮЧАТЬ столбцы в индекс, не добавляя эти столбцы в индексированные столбцы индекса. Включая дополнительные столбцы в индекс, мы увеличиваем размер индекса, но мы позволяем SQL Server читать индекс, не возвращаясь к кластеризованному индексу или к самой таблице для получения этих значений.

Ссылки

Для получения информации о специфике каждого из этих операторов в плане выполнения SQL Server см. ....

Джон Сэнсом
источник
7

Короткий ответ:

  • Сканирование индекса: коснитесь всех строк, кроме определенных столбцов.

  • Поиск по индексу: коснитесь определенных строк и определенных столбцов.

Большие глаза
источник
4

При сканировании индекса все строки в индексе сканируются, чтобы найти соответствующую строку. Это может быть эффективно для небольших столов. При поиске по индексу ему нужно только коснуться строк, которые действительно соответствуют критериям, и поэтому обычно более производительны.

AdaTheDev
источник
2

Сканирование индекса происходит, когда определение индекса не может найти в одной строке, чтобы удовлетворить предикатам поиска. В этом случае SQL Server должен просканировать несколько страниц, чтобы найти диапазон строк, удовлетворяющий предикатам поиска.

В случае поиска по индексу SQL Server находит одну строку, соответствующую предикатам поиска, используя определение индекса .

Поиск по индексу лучше и эффективнее.

кевчадеры
источник
0

Сканирование затрагивает каждую строку в таблице, даже если это то, что вам нужно или нет

Поиск смотрит только на те строки, которые вы ищете.

Всегда лучше иметь поиск, чем сканирование, поскольку он более эффективен при поиске данных.

Хорошее объяснение можно найти здесь

AutomatedTester
источник
3
Поиски не всегда лучше, например, если таблица относительно мала и необходимо вернуть большой процент строк в этой таблице, сканирование индекса может оказаться гораздо более эффективным.
Джастин
1
Привет, Джастин, я думаю, ты хочешь сказать, что сканирование таблиц иногда может быть лучше. Поиск по индексу всегда лучше, чем сканирование по индексу, если мы не говорим о кластеризации. Но иногда сканирование таблицы или сканирование кластерного индекса может быть более эффективным по указанной вами причине. Вместо поиска по индексу и получения полей, отсутствующих в индексе из таблицы, иногда ms sql будет использовать таблицу, даже если индекс имеет поле критериев.
Jose Areas