Как первичный ключ в логическом смысле (однозначно идентифицируя ваши строки) - да, абсолютно, имеет смысл.
НО: в SQL Server первичным ключом по умолчанию является также ключ кластеризации в вашей таблице, и использование ROWGUID
в качестве ключа кластеризации действительно очень плохо идея. См. Превосходные GUID Кимберли Триппа в качестве ПЕРВИЧНОГО и / или статью о ключе кластеризации для более подробной информации, почему бы не использовать GUID для кластеризации.
Поскольку GUID по определению является случайным, у вас будет ужасная фрагментация индекса и, следовательно, действительно очень низкая производительность при вставке, обновлении, удалении и выборе операторов.
Кроме того, поскольку ключ кластеризации добавляется в каждое поле каждого некластеризованного индекса в вашей таблице, вы тратите много места - как на диске, так и в оперативной памяти сервера - при использовании 16-байтовый GUID против 4-байтового INT.
Итак: да, в качестве первичного ключа у ROWGUID есть свои достоинства - но если вы его используете, определенно избегайте использования этого столбца в качестве ключа кластеризации в таблице! Используйте INT IDENTITY () или что-то подобное для этого.
Для ключа кластеризации, в идеале, вы должны искать четыре функции:
- стабильный (никогда не меняется)
- уникальный
- как можно меньше
- постоянно растет
INT IDENTITY () идеально подходит для этой цели. И да - ключ кластеризации должен быть уникальным, поскольку он используется для физического нахождения строки в таблице - если вы выберете столбец, который не может быть гарантированно уникальным, SQL Server фактически добавит четырехбайтовый уникализатор к вашему ключу кластеризации - опять же, не то, что вы хотите иметь ...
Извлечение Дебаты о кластеризованном индексе продолжаются - еще одна замечательная и проницательная статья Ким Трипп («Королева индексации SQL Server»), в которой она очень хорошо и подробно объясняет все эти требования.
1038 * MARC *