Я знаю, что этот тип вопросов часто возникает, но мне еще предстоит прочитать убедительные аргументы, которые помогут мне принять это решение. Пожалуйста, потерпите меня!
У меня огромная база данных - она увеличивается примерно на 10 000 000 записей в день. Данные являются реляционными, и по соображениям производительности я загружаю таблицу с BULK COPY. По этой причине мне нужно генерировать ключи для строк, и я не могу полагаться на столбец IDENTITY.
64-разрядное целое число - bigint - достаточно широк, чтобы я мог его использовать, но чтобы гарантировать уникальность, мне нужен централизованный генератор, чтобы сделать свои идентификаторы для меня. В настоящее время у меня есть такая служба генератора, которая позволяет службе резервировать порядковые номера X и гарантирует отсутствие коллизий. Однако следствием этого является то, что все службы, которые у меня есть, зависят от этого одного централизованного генератора, и поэтому я ограничен в том, как я могу распределить свою систему, и не доволен другими зависимостями (такими как требование доступа к сети) этим дизайном. Это было проблемой по случаю.
Сейчас я рассматриваю возможность использования последовательных идентификаторов GUID в качестве моих первичных ключей (сгенерированных внешне для SQL). Насколько мне удалось выяснить из моего собственного тестирования, единственным недостатком для них являются издержки дискового пространства более широкого типа данных (что усугубляется их использованием в индексах). Я не наблюдал заметного снижения производительности запросов по сравнению с альтернативой bigint. Загрузка таблицы с помощью BULK COPY немного медленнее, но ненамного. Мои основанные на GUID индексы не становятся фрагментированными благодаря моей последовательной реализации GUID.
По сути, я хочу знать, есть ли какие-то другие соображения, которые я мог упустить из виду. На данный момент я склонен сделать прыжок и начать использовать GUID. Я ни в коем случае не эксперт по базам данных, поэтому я очень ценю любые рекомендации.