SQL Server 2012 представлен Sequence
как новая функция, такая же, как в Oracle и Postgres. Где последовательности предпочтительнее идентичности? А зачем нам последовательности?
sql
sql-server
tsql
sql-server-2012
Слейман Джнейди
источник
источник
Ответы:
Я думаю ты найдешь здесь свой ответ
И вот :
а также здесь :
и на msdn вы также можете узнать больше об использовании и почему он нам нужен ( здесь ):
источник
Последовательность и идентичность используются для генерации автоматического номера, но основное различие заключается в том, что идентичность зависит от таблицы, а последовательность не зависит от таблицы.
Если у вас есть сценарий, в котором вам нужно поддерживать автоматический номер глобально (в нескольких таблицах), вам также необходимо перезапустить интервал после определенного номера, и вам нужно кэшировать его также для производительности, вот место, где нам нужна последовательность, а не личность.
источник
Хотя последовательности обеспечивают большую гибкость, чем столбцы идентификаторов, я не обнаружил, что они дают какие-либо преимущества в производительности.
Я обнаружил, что производительность при использовании идентичности постоянно в 3 раза выше, чем при использовании последовательности для пакетных вставок.
Я вставил около 1,5 млн строк, и производительность была:
Я вставил строки в таблицу, в которой использовался объект последовательности, через таблицу по умолчанию:
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.
источник
alter sequence increment by ...
просто используя, чтобы просто освободить место для ваших новых строк, а затем использовать base + row_number () или что-то еще для фактических значений.Я знаю, что это немного устарело, но хотел добавить замечание, которое меня укусило.
Я переключился с идентичности на последовательность, чтобы привести свои индексы в порядок. Позже я узнал, что последовательность не передается при репликации. Я начал получать ключевые нарушения после того, как настроил репликацию между двумя базами данных, поскольку последовательности не были синхронизированы. просто то, чего нужно остерегаться, прежде чем принимать решение.
источник
Я считаю, что лучше всего использовать «Последовательности» не для замены столбца идентификаторов, а для создания поля типа «Номер заказа».
Другими словами, номер заказа предоставляется конечному пользователю и может содержать бизнес-правила. Вы хотите, чтобы он был уникальным, но просто использовать столбец идентичности тоже неправильно.
Например, для разных типов заказов может потребоваться разная последовательность, поэтому у вас может быть последовательность для Интернет-заказов, а не для внутренних заказов.
Другими словами, не думайте о Последовательности как о простой замене идентичности, думайте о ней как о полезной в случаях, когда идентичность не соответствует бизнес-требованиям.
источник
Недавно было кое-что, чтобы рассмотреть для идентичности 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 может ограничить пропуски транзакциями, которые никогда не фиксируются.
источник
IDENTITY
числами и имеет ту же проблему, что и описанная здесь ссылка, но вы можете ограничить ее, установив меньший размер кеша, но тогда есть компромисс со скоростью.SEQUENCE