В чем разница между сканированием таблицы и кластеризованного индекса?
Так как 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 ответа:
в таблице без кластеризованного индекса (таблица кучи) страницы данных не связаны друг с другом - поэтому для обхода страниц требуется поиск в карте распределения индекса.
кластеризованная таблица, однако, имеет это страницы данных, связанные в двусвязном списке - делает последовательное сканирование немного быстрее. Конечно, в обмен у вас есть накладные расходы на поддержание страниц данных в порядке на
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: (), возвращаются только те строки, которые удовлетворяют предикату.