SQL Server 2012 представил Sequence
как новую функцию, такую же, как в Oracle и Postgres. Где последовательности предпочтительнее идентичности? И зачем нам нужны последовательности?
Последовательность против идентичности
Ответ 1
Я думаю, вы найдете свой ответ здесь
Используя атрибут identity для столбца, вы можете легко сгенерировать автоматически увеличивающиеся числа (которые часто используются как первичный ключ). С Последовательность, это будет другой объект, который вы можете прикрепить к столбец при вставке. В отличие от идентичности, следующее число для значение столбца будет извлекаться из памяти, а не из диска - это делает Sequence значительно быстрее, чем Identity. Посмотрим это в следующих примерах.
И здесь:
Последовательности: Последовательности были запрошены сообществом SQL Server в течение многих лет, и он включен в этот выпуск. Последовательность - пользователь определенный объект, который генерирует последовательность числа. Вот пример с использованием последовательности.
и здесь:
Объект последовательности SQL Server генерирует последовательность чисел, как столбец идентификаторов в таблицах sql. Но преимущество последовательности число - это номер последовательности. Объект не ограничен одним блоком таблица.
и на msdn вы также можете узнать больше об использовании и необходимости в нем (здесь):
Последовательность представляет собой пользовательский объект, привязанный к схеме, который генерирует последовательность числовых значений в соответствии со спецификацией, с которой последовательность была создана. Последовательность числовых значений генерируется в порядке возрастания или убывания с определенным интервалом и может цикл (повтор) в соответствии с запросом. Последовательности, в отличие от столбцов не связанных с таблицами. Приложение относится к объекту последовательности для получения следующего значения. Связь между последовательностями и таблицы контролируются приложением. Пользовательские приложения могут ссылаться на объект последовательности и координировать значения ключей в несколько строк и таблиц.
Последовательность создается независимо от таблиц с помощью CREATE ПОСЛЕДОВАТЕЛЬНОСТЬ. Параметры позволяют вам контролировать прирост, максимальные и минимальные значения, начальная точка, автоматический перезапуск возможности и кеширование для повышения производительности. Для получения информации о параметры см. в разделе CREATE SEQUENCE.
В отличие от значений столбцов идентификатора, которые генерируются, когда строки вставка, приложение может получить следующий порядковый номер до вставляя строку, вызывая функцию NEXT VALUE FOR. Последовательность номер присваивается при вызове NEXT VALUE FOR, даже если число никогда не вставлен в таблицу. Функция NEXT VALUE FOR может быть используется как значение по умолчанию для столбца в определении таблицы. использование sp_sequence_get_range, чтобы получить диапазон нескольких порядковых номеров в один раз.
Последовательность может быть определена как любой целочисленный тип данных. Если тип данных не указывается, последовательность по умолчанию имеет значение bigint.
Ответ 2
Последовательность и идентичность, используемые для генерации автоматического числа, но основное отличие: Identity является зависимым от таблицы, а Sequence не зависит от таблицы.
Если у вас есть сценарий, в котором вам необходимо поддерживать номер авто в глобальном масштабе (в нескольких таблицах), вам также необходимо перезапустить интервал после определенного номера, и вам нужно также кэшировать его для производительности, вот то место, где нам нужно последовательность и не идентичность.
Ниже приведены статьи, определяющие пример последовательности в реальном мире, его реализацию, а также разницу между последовательностью и идентификацией.
http://raresql.com/2012/04/29/how-sequence-works-in-sql-server-2012/ http://raresql.com/2012/05/01/difference-between-identity-and-sequence/
Ответ 3
Несмотря на то, что последовательности обеспечивают большую гибкость, чем столбцы идентификации, я не обнаружил, что они имеют какие-либо преимущества в производительности.
Я обнаружил, что производительность с использованием идентификатора была последовательно в 3 раза быстрее, чем использование последовательности для пакетных вставок.
Я вставил приблизительно 1.5M строк, и производительность была:
- 14 секунд для идентификации
- 45 секунд для последовательности
Я вставил строки в таблицу, которая использовала объект последовательности через таблицу по умолчанию:
NEXT VALUE for <seq> for <col_name>
а также попытался указать значение последовательности в выражении select:
SELECT NEXT VALUE for <seq>, <other columns> from <table>
Оба были тем же фактором медленнее, чем метод идентификации. Я использовал параметр кеша по умолчанию для последовательности.
В статье, приведенной в первой ссылке Arion, показана производительность для вставки строки за строкой, а различие между идентификатором и последовательностью - от 16,6 секунд до 14,3 секунды для 10 000 вставок.
Опция кэширования оказывает большое влияние на производительность, но для более высоких томов (+ 1M строк) идентификация выполняется быстрее
См. ссылку для независимого анализа в соответствии с комментарием utly4life.