Почему индексы создаются быстрее, когда в таблице есть PK? (SQL Server) - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть таблица, которая материализует SQL, она имеет 6 миллионов записей, которые используются только для операций SELECT.

Я создаю PK с полем, которое является номером строки, создание этого PK занимает большечем 5 минут в некоторых случаях. Создание индекса для этого поля, отличного от PK, занимает менее 30 секунд.

Когда я создаю PK, создание других дополнительных индексов (не связанных с полем PK) занимает примерно 1/3 времени, когда я надеваюне создавать PK (но создать индекс для поля PK).

Почему эта разница во времени?

Creating table (inserts): 262 sec
Creating index A (without PK constraint): 9 sec
Creating index C: 32 sec
Creating index D: 42 sec
Creating index E: 20 sec
Creating index F: 59 sec
Creating index G: 26 sec
Creating index H: 24 sec
Creating index I: 23 sec
Creating index J: 22 sec


Creating table (inserts): 135 sec
Creating index A (with PK constraint): 556 sec
Creating index C: 21 sec
Creating index D: 11 sec
Creating index E: 12 sec
Creating index F: 22 sec
Creating index G: 11 sec
Creating index H: 11 sec
Creating index I: 11 sec
Creating index J: 10 sec

Дополнительные индексы из одного поля: текста или даты.

Анализируя эти сценарии, кажется, что лучше создать PK (даже не используя его в SQL), потому что, если вы создадите больше индексов, будет быстрее, хотя создание PK будет намного медленнее, но я не понимаю, почему.

1 Ответ

2 голосов
/ 07 ноября 2019

Проблема не в первичном ключе. Это факт, что первичный ключ кластеризован (по умолчанию). Увеличение скорости, вероятно, связано с тем, что кластерный (т.е. первичный) ключ значительно меньше альтернативного, который является локатором строки .

Большая часть создания индекса перемещает данныевокруг (сортировка по ключам и сохранение результатов на страницах индекса).

Документация объясняет:

Локаторы строк в строках некластеризованного индекса либо являютсяуказатель на строку или ключ кластеризованного индекса для строки, как описано ниже:

  • Если таблица представляет собой кучу, что означает, что она не имеет кластеризованного индекса,Локатор строк - это указатель на строку. Указатель строится из идентификатора файла (ID), номера страницы и номера строки на странице. Весь указатель известен как идентификатор строки (RID).

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

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

...