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

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

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

Ответы на вопрос(6)

Решение Вопроса

Я думаю, что вы найдете свой ответВот

Using the identity attribute for a column, you can easily generate auto-incrementing numbers (which as often used as a primary key). With Sequence, it will be a different object which you can attach to a table column while inserting. Unlike identity, the next number for the column value will be retrieved from memory rather than from the disk – this makes Sequence significantly faster than Identity. We will see this in coming examples.

А такжеВот:

Sequences: Sequences have been requested by the SQL Server community for years, and it's included in this release. Sequence is a user defined object that generates a sequence of a number. Here is an example using Sequence.

а такжеВот также:

A SQL Server sequence object generates sequence of numbers just like an identity column in sql tables. But the advantage of sequence numbers is the sequence number object is not limited with single sql table.

и на MSDN вы также можете прочитать больше об использовании и зачем нам это нужно (Вот):

A sequence is a user-defined schema-bound object that generates a sequence of numeric values according to the specification with which the sequence was created. The sequence of numeric values is generated in an ascending or descending order at a defined interval and may cycle (repeat) as requested. Sequences, unlike identity columns, are not associated with tables. An application refers to a sequence object to receive its next value. The relationship between sequences and tables is controlled by the application. User applications can reference a sequence object and coordinate the values keys across multiple rows and tables.

A sequence is created independently of the tables by using the CREATE SEQUENCE statement. Options enable you to control the increment, maximum and minimum values, starting point, automatic restarting capability, and caching to improve performance. For information about the options, see CREATE SEQUENCE.

Unlike identity column values, which are generated when rows are inserted, an application can obtain the next sequence number before inserting the row by calling the NEXT VALUE FOR function. The sequence number is allocated when NEXT VALUE FOR is called even if the number is never inserted into a table. The NEXT VALUE FOR function can be used as the default value for a column in a table definition. Use sp_sequence_get_range to get a range of multiple sequence numbers at once.

A sequence can be defined as any integer data type. If the data type is not specified, a sequence defaults to bigint.

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

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

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

 27 дек. 2018 г., 17:08
Есть довольно хороший ответ, почему вы пропускаетеIDENTITY чиселlink а такжеSEQUENCE имеет ту же проблему, как описано здесьlink но вы можете ограничить его, установив меньший размер CACHE, но тогда есть компромисс со скоростью.

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

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

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

14 seconds for identity 45 seconds for sequence

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

NEXT VALUE for <seq> for <col_name>

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

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

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

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

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

Видеть этоссылка на сайт для углубленного анализа согласно комментарию utly4life.

 24 окт. 2014 г., 17:21
50, увеличение это имеет значение, но я помню, личность все еще была быстрее.
 12 авг. 2016 г., 04:09
Вы предлагаете последовательности медленнее, чем столбец идентичности? У меня сложилось противоположное впечатление, поскольку последовательности находятся в памяти в отличие от идентификатора, который извлекается с диска. Ваши выводы довольно удивительны. Рад, что вы поделились.
 12 авг. 2016 г., 10:10
да в большинстве случаев Смотрите ссылку в комментариях выше, также обновленный ответ с уточнениями.
 23 окт. 2014 г., 22:31
Каков был размер кэша последовательности.
 09 июл. 2015 г., 00:56
byobi.com/blog/2012/09/…  Обеспечивает хорошее подробное сравнение различных конфигураций. Показывает, что увеличение размера кэша с 50 до 500 привело к примерно 2-кратной разнице в скорости.

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

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

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

http://raresql.com/2012/04/29/how-sequence-works-in-sql-server-2012/ http://raresql.com/2012/05/01/difference-between-identity-and-sequence/

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

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

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

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

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

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

Ваш ответ на вопрос