На моей работе мы используем UUID в качестве PK. Из опыта я могу сказать, что НЕ ИСПОЛЬЗУЙТЕ ИХ как ПК (кстати, SQL Server).
Это одна из тех вещей, когда у вас меньше 1000 записей, это нормально, но когда у вас есть миллионы, это худшее, что вы можете сделать. Зачем? Поскольку UUID не являются последовательными, поэтому каждый раз, когда вставляется новая запись, MSSQL необходимо перейти на нужную страницу, чтобы вставить запись, а затем вставить запись. Действительно неприятное последствие этого состоит в том, что все страницы имеют разный размер и фрагментированы, поэтому теперь мы должны выполнять периодическую фрагментацию.
Когда вы используете автоинкремент, MSSQL всегда будет переходить на последнюю страницу, и вы в конечном итоге получите страницы одинакового размера (теоретически), поэтому производительность для выбора этих записей намного выше (также потому, что INSERT не будут блокировать таблицу / страница так долго).
Однако большое преимущество использования UUID в качестве PK заключается в том, что если у нас есть кластеры БД, при слиянии не будет конфликтов.
Я бы порекомендовал следующую модель:
1. PK INT Идентичность
2. Дополнительный столбец автоматически генерируется как UUID.
Таким образом, процесс слияния возможен (UUID будет вашим РЕАЛЬНЫМ ключом, в то время как PK будет просто временным, что даст вам хорошую производительность).
ПРИМЕЧАНИЕ. Лучшее решение - использовать NEWSEQUENTIALID (как я уже говорил в комментариях), но для устаревшего приложения, у которого не так много времени на рефакторинг (и еще хуже, не контролируя все вставки), это сделать невозможно ,
Но на самом деле, начиная с 2017 года, я бы сказал, что лучшим решением здесь является NEWSEQUENTIALID или создание Guid.Comb с NHibernate.
Надеюсь, это поможет