GUID
может показаться естественным выбором для вашего первичного ключа - и, если вам действительно нужно, вы, вероятно, можете поспорить, что он будет использоваться для первичного ключа таблицы.Я бы настоятельно рекомендовал не делать - использовать столбец GUID
в качестве ключа кластеризации , что SQL Server делает по умолчанию, если вы специально не запретите.
Вам действительно нужно разделить две проблемы:
Первичный ключ представляет собой логическую конструкцию - один из ключей-кандидатов, который однозначно и надежно идентифицирует каждыйстрока в вашей таблице.На самом деле это может быть что угодно - INT
, GUID
, строка - выберите наиболее подходящий для вашего сценария.
Ключ кластеризации (столбец или столбцы, которые определяют «кластеризованный индекс» в таблице) - это физическая вещь, связанная с хранением, и здесь ваш маленький, стабильный, постоянно увеличивающийся тип данных - ваш лучший выбор -INT
или BIGINT
как вариант по умолчанию.
По умолчанию первичный ключ в таблице SQL Server также используется в качестве ключа кластеризации, но это не обязательно должно быть так!Я лично наблюдал значительное увеличение производительности, когда разбивал предыдущий первичный / кластеризованный ключ на основе GUID на два отдельных ключа - первичный (логический) ключ на GUID
и ключ кластеризации (упорядочения) на отдельном INT IDENTITY(1,1)
колонка.
Как Кимберли Трипп - Королева индексации - и другие неоднократно заявляли - GUID
, поскольку ключ кластеризации не является оптимальным, посколькуиз-за своей случайности это приведет к массовой фрагментации страниц и индексов и в целом к плохой производительности.
Да, я знаю - в SQL Server 2005 и более поздних версиях newsequentialid()
, но даже это не совсем и полностьюпоследовательный и, следовательно, также страдает от тех же проблем, что и GUID
- чуть менее заметно.
Затем следует рассмотреть еще одну проблему: ключ кластеризации в таблице будет добавлен к каждой записи вкаждый некластеризованный индекс в вашей таблице - таким образом, вы действительно хотите убедиться, что он как можно меньше.Как правило, INT
с 2+ миллиардами строк должно быть достаточно для подавляющего большинства таблиц - и по сравнению с GUID
в качестве ключа кластеризации вы можете сэкономить сотни мегабайт хранилища на диске и в памяти сервера.
Быстрый расчет - использование INT
против GUID
в качестве основного и кластерного ключа:
- Базовая таблица с 1 000 000 строк (3,8 МБ против 15,26 МБ)
- 6 некластеризованных индексов (22,89 МБ против 91,55 МБ)
ИТОГО: 25 МБ против 106 МБ - и это только на одной таблице!
И да - больший размер таблицы или индекса автоматически означает больше страниц данных, которые необходимо загрузить с диска, сохранить в памяти, передать клиенту - все это негативно влияет на вашу производительность. Какое влияние действительно зависит от множества факторов, влияющих на дизайн вашей базы данных и распределение ваших данных, поэтому любые обобщенные прогнозы практически невозможны ...
Еще немного пищи для размышлений - отличноматериал Кимберли Трипп - читай, читай снова, переваривай!На самом деле это Евангелие для индексирования SQL Server.