У меня есть таблица, которая потенциально будет иметь большое количество вставок в секунду, и я пытаюсь выбрать тип первичного ключа, который я хочу использовать. Для примера, это таблица пользователей. Я пытаюсь выбрать между использованием GUID и BIGINT в качестве первичного ключа и, в конечном счете, как UserID в приложении. Если я использую GUID, я сохраняю поездку в базу данных для генерации нового идентификатора, но GUID не является «удобным для пользователя», и невозможно разбить таблицу на этот идентификатор (который я планирую сделать). Использование BIGINT гораздо удобнее, но генерировать проблему - я не могу использовать IDENTITY (есть причина для этого), поэтому мой единственный выбор - иметь некоторую вспомогательную таблицу, которая будет содержать последний использованный ID, а затем я вызываю это хранится в процессе:Выбор типа первичного ключа
create proc GetNewID @ID BIGINT OUTPUT
as
begin
update HelperIDTable set @ID=id, id = id + 1
end
для получения нового идентификатора. Но тогда эта вспомогательная таблица является очевидным узким местом, и я обеспокоен тем, сколько обновлений в секунду она может сделать.
Мне очень нравится идея использования BIGINT как pk, но проблема с узким местом касается меня - есть ли способ приблизиться к оценке количества идентификаторов, которые он может производить в секунду? Я понимаю, что это сильно зависит от аппаратного обеспечения, но есть ли какие-либо физические ограничения и в какой степени мы смотрим? 100 'S/сек? 1000-х/сек?
Любые идеи о том, как подойти к проблеме, высоко оценены! Эта проблема не позволяет мне спать уже много ночи!
Спасибо! Andrey
Не могли бы вы быть более конкретными относительно того, почему вы не можете использовать IDENTITY? –
Кроме того, BIGINT - очень большой int, для вас не хватит INT? Если это таблица пользователей, насколько вероятно, что у вас будет больше, чем 2 147 483 647 пользователей? –
, если вы вызываете эту процедуру в транзакции с другими транзакциями CRUD, вы будете блокировать и вызывать ожидание –