В чем разница между сканированием таблицы и кластеризованного индекса?


Так как Table Scan и Clustered Index Scan по существу сканировать все записи в таблице, почему кластеризованный индекс сканирования якобы лучше?

в качестве примера-какова разница в производительности между следующими, когда есть много записей?:

declare @temp table(
    SomeColumn varchar(50)
)

insert into @temp
select 'SomeVal'

select * from @temp

-----------------------------

declare @temp table(
    RowID int not null identity(1,1) primary key,
    SomeColumn varchar(50)
)

insert into @temp
select 'SomeVal'

select * from @temp
3 66

3 ответа:

в таблице без кластеризованного индекса (таблица кучи) страницы данных не связаны друг с другом - поэтому для обхода страниц требуется поиск в карте распределения индекса.

кластеризованная таблица, однако, имеет это страницы данных, связанные в двусвязном списке - делает последовательное сканирование немного быстрее. Конечно, в обмен у вас есть накладные расходы на поддержание страниц данных в порядке на INSERT,UPDATE и DELETE. Таблицы кучи, однако, требуется вторая запись в IAM.

если ваш запрос имеет RANGE оператора (например: SELECT * FROM TABLE WHERE Id BETWEEN 1 AND 100), то кластеризованная таблица (находящаяся в гарантированном порядке) была бы более эффективной - поскольку она могла бы использовать индексные страницы для поиска соответствующих страниц данных. Куча должна была бы сканировать все строки, так как она не может полагаться на порядок.

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

так:

  • для вашего примера запроса, где вы выбираете все строки, единственное различие-это двусвязный список, который поддерживает кластеризованный индекс. Это должно сделать вашу кластеризованную таблицу немного быстрее, чем куча с большим количеством строк.

  • на запрос WHERE предложение, которое может быть (по крайней мере частично) удовлетворено кластеризованным индексом, вы выйдете вперед из-за заказа - так что вам не придется сканировать всю таблицу.

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

  • на INSERT,UPDATE и DELETE куча может или не может выиграть. Куча не должна поддерживать порядок, но требует второй записи в IAM. Я думаю, что родственник разница в производительности будет незначительной, но также довольно зависит от данных.

Microsoft имеет техническое описание который сравнивает кластеризованный индекс с эквивалентным некластеризованным индексом в куче (не совсем так, как я обсуждал выше, но близко). Их вывод в основном заключается в том, чтобы поместить кластеризованный индекс на все таблицы. Я сделаю все возможное, чтобы суммировать их результаты (опять же, обратите внимание, что они действительно сравнивают некластеризованный индекс с кластеризованным индексом здесь - но я думаю, что это относительно сопоставимых):

  • INSERT производительность: кластеризованный индекс выигрывает примерно на 3% из-за второй писать, необходимых для кучи.
  • UPDATE производительность: кластеризованный индекс выигрывает примерно на 8% из-за второго поиска, необходимого для кучи.
  • DELETE производительность: кластеризованный индекс выигрывает примерно на 18% из-за необходимости второго поиска и второго удаления из IAM для кучи.
  • один SELECT производительность: кластеризованный индекс выигрывает примерно на 16% из-за второго поиска, необходимого для кучи.
  • ряд SELECT производительность: кластеризованный индекс выигрывает около 29% из-за случайного порядка для кучи.
  • одновременно INSERT: таблица кучи выигрывает на 30% при загрузке из-за разделения страниц для кластеризованного индекса.

http://msdn.microsoft.com/en-us/library/aa216840 (SQL. 80). aspx

логический и физический оператор сканирования кластеризованного индекса сканирует кластеризованный индекс, указанный в столбце аргумент. При наличии необязательного предиката WHERE: () возвращаются только те строки, которые удовлетворяют предикату. Если столбец аргумента содержит предложение ORDERED, обработчик запросов запрашивает, чтобы выходные данные строк возвращались в порядке сортировки кластеризованного индекса их. Если предложение ORDERED отсутствует, механизм хранения будет сканировать индекс оптимальным образом (не гарантируя сортировку выходных данных).

http://msdn.microsoft.com/en-us/library/aa178416 (SQL. 80). aspx

логический и физический оператор Table Scan извлекает все строки из таблицы, указанной в столбце Argument. Если в столбце аргумент отображается предикат WHERE: (), возвращаются только те строки, которые удовлетворяют предикату.

сканирование таблицы должно исследовать каждую строку таблицы. При сканировании кластеризованного индекса необходимо сканировать только индекс. Он не сканирует каждую запись в таблице. В этом и заключается суть индексов.