В таблице без кластеризованного индекса (таблица кучи) страницы данных не связаны друг с другом, поэтому для просмотра страниц требуется поиск в карте распределения индекса.
Однако в кластеризованной таблице страницы данных связаны двусвязным списком - сделать последовательное сканирование немного быстрее. Конечно, взамен вам придется поддерживать порядок страниц данных на INSERT
, UPDATE
и DELETE
. Однако таблица кучи требует второй записи в IAM.
Если в вашем запросе есть оператор RANGE
(например: SELECT * FROM TABLE WHERE Id BETWEEN 1 AND 100
), то кластеризованная таблица (находящаяся в гарантированном порядке) будет более эффективной, поскольку она может использовать страницы индекса для поиска соответствующих страниц данных. Куча должна была бы сканировать все строки, так как она не может полагаться на порядок.
И, конечно же, кластеризованный индекс позволяет вам выполнять CLUSTERED INDEX SEEK, который в значительной степени оптимален для производительности... куча без индексов всегда приводит к сканированию таблицы.
So:
Для вашего примерного запроса, в котором вы выбираете все строки, единственное отличие состоит в двусвязном списке, поддерживаемом кластеризованным индексом. Это должно сделать вашу кластеризованную таблицу немного быстрее, чем кучу с большим количеством строк.
Для запроса с предложением WHERE
, который может быть (по крайней мере частично) удовлетворен кластеризованным индексом, вы выйдете вперед из-за порядка, поэтому вам не придется сканировать всю таблицу.
Для запроса, который не удовлетворяется кластеризованным индексом, вы в значительной степени даже... опять же, единственное отличие состоит в том, что двусвязный список для последовательного сканирования. В любом случае, вы неоптимальны.
Для INSERT
, UPDATE
и DELETE
куча может выиграть или не выиграть. Куча не должна поддерживать порядок, но требует второй записи в IAM. Я думаю, что относительная разница в производительности будет незначительной, но также сильно зависит от данных.
У Microsoft есть технический документ, в котором кластеризованный индекс сравнивается с эквивалентным не -кластеризованный индекс в куче (не совсем то, что я обсуждал выше, но близко). Их вывод в основном состоит в том, чтобы поместить кластеризованный индекс во все таблицы. Я сделаю все возможное, чтобы обобщить их результаты (опять же, обратите внимание, что они действительно сравнивают некластеризованный индекс с кластеризованным индексом здесь, но я думаю, что это относительно сопоставимо):
INSERT
производительность: кластеризованный индекс выигрывает примерно на 3% из-за второй записи, необходимой для кучи.
UPDATE
производительность: кластеризованный индекс выигрывает примерно на 8% из-за второго поиска, необходимого для кучи.
DELETE
производительность: кластеризованный индекс выигрывает примерно на 18% из-за необходимости второго поиска и второго удаления из IAM для кучи.
- одиночная производительность
SELECT
: кластеризованный индекс выигрывает примерно на 16% из-за второго поиска, необходимого для кучи.
- производительность диапазона
SELECT
: кластеризованный индекс выигрывает примерно на 29% из-за случайного упорядочения кучи.
- concurrent
INSERT
: таблица кучи выигрывает на 30% под нагрузкой из-за разделения страниц для кластеризованного индекса.
person
Mark Brackett
schedule
20.08.2008