GUID может ухудшить производительность, но не обязательно.Я использую их все время, а также использую целочисленные первичные ключи, в зависимости от ситуации.
Если вы не можете указать на конкретную проблему с производительностью, мой совет - оставить достаточно хорошо один.
Самая большая проблема с использованием uniqueidentifier
заключается в том, как генерировать новые значения идентификаторов, особенно если первичный ключ находится в кластеризованном индексе.Если вы используете NEWID()
, это довольно случайно, поэтому он может вставляться в любое место в табличном пространстве, вызывая ненужные разбиения страницы.Использовать NEWSEQUENTIALID()
лучше, поскольку он создает последовательные уникальные идентификаторы, но при каждом запуске базы данных он имеет новое случайное начальное число, поэтому он также не всегда добавляется в конец таблицы.
Лучшее решение IMHOдолжен использовать GUID в стиле COMB, который имеет часть, основанную на временной метке (которая, конечно, монотонно увеличивается), и часть, которая является случайной.(В качестве крошечного побочного эффекта вы можете декодировать часть метки времени, если вам когда-либо понадобится узнать, когда произошла ВСТАВКА, при условии, что информация также не сохраняется в другом месте.)
Вот пример функции COMB:
CREATE FUNCTION [dbo].NewCOMB(@GUID uniqueidentifier)
RETURNS uniqueidentifier AS BEGIN
RETURN CAST(
CAST(NEWID() AS binary(10))
+ CAST(GETDATE() AS binary(6))
AS uniqueidentifier)
END;
Вот отличная статья на эту тему, немного устаревшая, но все же хорошая:
http://www.informit.com/articles/article.aspx?p=25862&seqNum=7
Если вы обнаружите, что должны сменить лошадей, сделайте это следующим образом:
- Добавить новые столбцы идентификаторов в каждую таблицу под другим именем
- Заполнить их
- При необходимости проиндексировать их
- Снять ограничения таблицы настарые столбцы
- Добавление новых ограничений для новых столбцов
- Удаление старых столбцов
- Переименование новых столбцов в старые имена (при необходимости)