В плане выполнения SQL Server в чем разница между сканированием индекса и поиском индекса
Я использую SQL Server 2005.
Ответы:
Сканирование индекса - это когда SQL-сервер считывает весь индекс в поисках совпадений - время, необходимое для этого, пропорционально размеру индекса.
Поиск по индексу - это когда SQL-сервер использует структуру b-дерева индекса для прямого поиска совпадающих записей (см. Http://mattfleming.com/node/192, чтобы узнать, как это работает) - затраченное время пропорционально только количество совпадающих записей.
Основное правило: сканирование - плохо, поиск - хорошо.
Индексное сканирование
Когда SQL Server выполняет сканирование, он загружает объект, который он хочет прочитать с диска, в память, а затем читает этот объект сверху вниз в поисках необходимых ему записей.
Поиск по индексу
Когда SQL Server выполняет поиск, он знает, где в индексе должны быть данные, поэтому он загружает индекс с диска, переходит непосредственно к той части индекса, которая ему нужна, и считывает туда, где заканчиваются нужные данные. . Очевидно, что это гораздо более эффективная операция, чем сканирование, поскольку SQL уже знает, где находятся данные, которые он ищет.
Как я могу изменить план выполнения, чтобы использовать поиск вместо сканирования?
Когда SQL Server ищет ваши данные, вероятно, одна из самых важных вещей, которая заставит SQL Server переключиться с поиска на сканирование, - это когда некоторые из столбцов, которые вы ищете, не включены в индекс, который вы хотите использовать. Чаще всего в этом случае SQL Server возвращается к сканированию кластерного индекса, поскольку кластерный индекс содержит все столбцы в таблице. Это одна из основных причин (по крайней мере, на мой взгляд) того, что теперь у нас есть возможность ВКЛЮЧАТЬ столбцы в индекс, не добавляя эти столбцы в индексированные столбцы индекса. Включая дополнительные столбцы в индекс, мы увеличиваем размер индекса, но мы позволяем SQL Server читать индекс, не возвращаясь к кластеризованному индексу или к самой таблице для получения этих значений.
Ссылки
Для получения информации о специфике каждого из этих операторов в плане выполнения SQL Server см. ....
Короткий ответ:
Сканирование индекса: коснитесь всех строк, кроме определенных столбцов.
Поиск по индексу: коснитесь определенных строк и определенных столбцов.
При сканировании индекса все строки в индексе сканируются, чтобы найти соответствующую строку. Это может быть эффективно для небольших столов. При поиске по индексу ему нужно только коснуться строк, которые действительно соответствуют критериям, и поэтому обычно более производительны.
Сканирование индекса происходит, когда определение индекса не может найти в одной строке, чтобы удовлетворить предикатам поиска. В этом случае SQL Server должен просканировать несколько страниц, чтобы найти диапазон строк, удовлетворяющий предикатам поиска.
В случае поиска по индексу SQL Server находит одну строку, соответствующую предикатам поиска, используя определение индекса .
Поиск по индексу лучше и эффективнее.
Сканирование затрагивает каждую строку в таблице, даже если это то, что вам нужно или нет
Поиск смотрит только на те строки, которые вы ищете.
Всегда лучше иметь поиск, чем сканирование, поскольку он более эффективен при поиске данных.
Хорошее объяснение можно найти здесь