Последовательность против идентичности

87

SQL Server 2012 представлен Sequenceкак новая функция, такая же, как в Oracle и Postgres. Где последовательности предпочтительнее идентичности? А зачем нам последовательности?

Слейман Джнейди
источник
После использования обоих я предпочитаю Identity для глобального использования в базе данных. То есть там, где вам нужно автоматически увеличивающееся число, такое как ObjectID, и вы хотите использовать его во многих таблицах. Усложняется создание последовательности, а затем использование приложения (веб-сайта или приложения и т. Д.) Для управления вставкой и обновлением таблиц на основе порядкового номера.
Том первый

Ответы:

81

Я думаю ты найдешь здесь свой ответ

Используя атрибут identity для столбца, вы можете легко генерировать автоматически увеличивающиеся числа (которые часто используются в качестве первичного ключа). С Sequence это будет другой объект, который вы можете прикрепить к столбцу таблицы при вставке. В отличие от идентификатора, следующий номер для значения столбца будет извлекаться из памяти, а не с диска - это делает Sequence значительно быстрее, чем Identity. Мы увидим это на следующих примерах.

И вот :

Последовательности: Последовательности запрашивались сообществом SQL Server в течение многих лет, и они включены в этот выпуск. Последовательность - это определенный пользователем объект, который генерирует последовательность чисел. Вот пример использования последовательности.

а также здесь :

Объект последовательности SQL Server генерирует последовательность чисел так же, как столбец идентификаторов в таблицах sql. Но преимущество порядковых номеров заключается в том, что объект порядковых номеров не ограничен одной таблицей sql.

и на msdn вы также можете узнать больше об использовании и почему он нам нужен ( здесь ):

Последовательность - это определяемый пользователем объект с привязкой к схеме, который генерирует последовательность числовых значений в соответствии со спецификацией, с которой была создана последовательность. Последовательность числовых значений создается в порядке возрастания или убывания с заданным интервалом и может циклически (повторяться) по запросу. Последовательности, в отличие от столбцов идентификации, не связаны с таблицами. Приложение обращается к объекту последовательности, чтобы получить его следующее значение. Отношения между последовательностями и таблицами контролируются приложением. Пользовательские приложения могут ссылаться на объект последовательности и координировать ключи значений в нескольких строках и таблицах.

Последовательность создается независимо от таблиц с помощью оператора CREATE SEQUENCE. Параметры позволяют контролировать приращение, максимальные и минимальные значения, начальную точку, возможность автоматического перезапуска и кэширование для повышения производительности. Для получения информации о параметрах см. СОЗДАТЬ ПОСЛЕДОВАТЕЛЬНОСТЬ.

В отличие от значений столбца идентификаторов, которые генерируются при вставке строк, приложение может получить следующий порядковый номер перед вставкой строки, вызвав функцию СЛЕДУЮЩЕЕ ЗНАЧЕНИЕ ДЛЯ. Порядковый номер назначается при вызове NEXT VALUE FOR, даже если номер никогда не вставляется в таблицу. Функцию NEXT VALUE FOR можно использовать как значение по умолчанию для столбца в определении таблицы. Используйте процедуру sp_sequence_get_range, чтобы получить сразу несколько порядковых номеров.

Последовательность может быть определена как любой целочисленный тип данных. Если тип данных не указан, по умолчанию используется последовательность bigint.

Арион
источник
21

Последовательность и идентичность используются для генерации автоматического номера, но основное различие заключается в том, что идентичность зависит от таблицы, а последовательность не зависит от таблицы.

Если у вас есть сценарий, в котором вам нужно поддерживать автоматический номер глобально (в нескольких таблицах), вам также необходимо перезапустить интервал после определенного номера, и вам нужно кэшировать его также для производительности, вот место, где нам нужна последовательность, а не личность.

user1059637
источник
14

Хотя последовательности обеспечивают большую гибкость, чем столбцы идентификаторов, я не обнаружил, что они дают какие-либо преимущества в производительности.

Я обнаружил, что производительность при использовании идентичности постоянно в 3 раза выше, чем при использовании последовательности для пакетных вставок.

Я вставил около 1,5 млн строк, и производительность была:

  • 14 секунд для идентификации
  • 45 секунд на последовательность

Я вставил строки в таблицу, в которой использовался объект последовательности, через таблицу по умолчанию:

NEXT VALUE for <seq> for <col_name>

а также попытался указать значение последовательности в операторе выбора:

SELECT NEXT VALUE for <seq>, <other columns> from <table>

Оба были на один и тот же фактор медленнее, чем метод идентификации. Я использовал параметр кеширования по умолчанию для последовательности.

В статье, указанной в первой ссылке Arion, показана производительность для построчной вставки, а разница между идентичностью и последовательностью составляла от 16,6 до 14,3 секунд для 10 000 вставок.

Параметр кэширования имеет большое влияние на производительность, но идентификация выполняется быстрее для больших объемов (+1 миллион строк)

См. Эту ссылку для более глубокого анализа в соответствии с комментарием utly4life.

Stagg
источник
Каков был размер кэша последовательности.
Шеннон Северанс
50, увеличение действительно имеет значение, но я помню, что идентификация все еще была быстрее.
Stagg
2
byobi.com/blog/2012/09/… Обеспечивает хорошее подробное сравнение различных конфигураций. Показывает, что увеличение размера кэша с 50 до 500 дало примерно двукратную разницу в скорости.
ulty4life 08
1
Вы предлагаете последовательности медленнее, чем столбец идентичности? У меня сложилось противоположное впечатление, так как последовательности находятся в памяти, в отличие от идентичности, которая извлекается с диска. Ваши выводы весьма удивительны. Рад, что вы поделились.
RBT,
1
с помощью последовательности вы можете оптимизировать производительность пакетной вставки, alter sequence increment by ...просто используя, чтобы просто освободить место для ваших новых строк, а затем использовать base + row_number () или что-то еще для фактических значений.
Горди
6

Я знаю, что это немного устарело, но хотел добавить замечание, которое меня укусило.

Я переключился с идентичности на последовательность, чтобы привести свои индексы в порядок. Позже я узнал, что последовательность не передается при репликации. Я начал получать ключевые нарушения после того, как настроил репликацию между двумя базами данных, поскольку последовательности не были синхронизированы. просто то, чего нужно остерегаться, прежде чем принимать решение.

Кен
источник
3

Я считаю, что лучше всего использовать «Последовательности» не для замены столбца идентификаторов, а для создания поля типа «Номер заказа».

Другими словами, номер заказа предоставляется конечному пользователю и может содержать бизнес-правила. Вы хотите, чтобы он был уникальным, но просто использовать столбец идентичности тоже неправильно.

Например, для разных типов заказов может потребоваться разная последовательность, поэтому у вас может быть последовательность для Интернет-заказов, а не для внутренних заказов.

Другими словами, не думайте о Последовательности как о простой замене идентичности, думайте о ней как о полезной в случаях, когда идентичность не соответствует бизнес-требованиям.

Грег Гам
источник
1

Недавно было кое-что, чтобы рассмотреть для идентичности vs последовательности. Кажется, MSFT теперь предлагает последовательность, если вы хотите сохранить идентичность без пробелов. У нас была проблема, когда в идентификаторе были огромные пробелы, но на основе этого выделенного утверждения наша проблема объясняется тем, что SQL кэшировал идентификатор, и после перезагрузки мы потеряли эти числа.

https://docs.microsoft.com/en-us/sql/t-sql/statements/create-table-transact-sql-identity-property?view=sql-server-2017

Последовательные значения после перезапуска сервера или других сбоев - SQL Server может кэшировать значения идентификаторов по соображениям производительности, а некоторые из назначенных значений могут быть потеряны во время сбоя базы данных или перезапуска сервера. Это может привести к пропускам идентификационного значения при вставке. Если пропуски недопустимы, приложение должно использовать свой собственный механизм для генерации значений ключей. Использование генератора последовательности с параметром NOCACHE может ограничить пропуски транзакциями, которые никогда не фиксируются.

awilbourn
источник
1
Существует довольно хороший ответ на вопрос, почему вы пропускаете ссылку сIDENTITY числами и имеет ту же проблему, что и описанная здесь ссылка, но вы можете ограничить ее, установив меньший размер кеша, но тогда есть компромисс со скоростью. SEQUENCE
Mrphin