В своем ответе « Что лучше»: столбцы идентификаторов или сгенерированные уникальные значения идентификаторов? Мрденни говорит:
Когда выйдет SQL Denali, он будет поддерживать последовательности, которые будут более эффективными, чем идентичность, но вы не сможете создать что-то более эффективное самостоятельно.
Я не совсем уверен. Зная последовательности Oracle , я должен либо создать триггер для вставки, инкапсулировать каждую вставку в вызов хранимой процедуры, либо молиться, чтобы я не забыл правильно использовать последовательность, когда выполняю вставку ad-hoc.
Я сомневаюсь, что преимущества последовательностей настолько очевидны.
sql-server
sql-server-2012
sequence
bernd_k
источник
источник
Ответы:
Я также отвечу здесь. Это связано с внутренностями того, как
IDENTITY
и какSEQUENCE
работать.С помощью
IDENTITY
SQL Server предварительно кэширует значения в памяти, чтобы они были легко доступны. Смотрите ответ Мартина Смита для деталей. Поскольку используются значения, фоновый процесс генерирует больше значений. Как вы можете себе представить, этот пул может закончиться довольно быстро, оставив приложение во власти фонового процесса, который генерирует значения.С помощью
SEQUENCE
SQL Server вы можете определить размер кэша. Хотя SQL Server на самом деле не хранит значения в кэше, он сохраняет только текущее значение и верхнее значение, это значительно уменьшит количество операций ввода-вывода, необходимых для создания значений.Не устанавливайте кэш слишком высоко, так как это уменьшит количество чисел, которые можно использовать: если SQL Server потерпит крах, любые значения, указанные в текущем диапазоне кеша, которые не были использованы, будут потеряны.
Что касается вставки строки, просто укажите значение по умолчанию для столбца, например так:
источник
С тех пор, как была написана статья Ицик Бен Ган, жестко закодированный размер кэша 10,
IDENTITY
похоже, изменился. Из комментариев к этому элементу подключенияКнига запросов T-SQL содержит следующую таблицу, но подчеркивает, что эти значения не документированы и не гарантируются неизменными.
В этой статье мы проверяем различные размеры кэша последовательностей и размеры пакетов вставок и приводим следующие результаты.
Который, кажется, показывает, что для больших вставок
IDENTITY
выполняетSEQUENCE
. Тем не менее, он не проверяет размер кеша 1000, и эти результаты - только один тест. Рассматривая конкретно размер кэша 1000 с различными размерами пакетов вставок, я получил следующие результаты (пробуя каждый размер пакета 50 раз и агрегируя результаты как показано ниже - все разы в мкс).Для больших размеров партии
IDENTITY
версия кажется вообще более быстрой .Книга запросов TSQL также объясняет, почему
IDENTITY
может иметь преимущество в производительности над последовательностью.IDENTITY
Столовое специфичны иSEQUENCE
не является. Если произошла авария в середине вставки до того, как буфер журнала был сброшен, не имеет значения, является ли восстановленная идентификация более ранней, поскольку процесс восстановления также отменяет вставку, поэтому SQL Server не принудительно сбрасывает буфер журнала при каждой идентификации запись диска на кеш. Однако для последовательности это будет исполнено , поскольку значение может быть использовано для любых целей - в том числе и за пределами базы данных. Таким образом, в приведенном выше примере с миллионом вставок и размером кэша в 1000 это дополнительные тысячи сбросов журнала.Скрипт для воспроизведения
источник