Последовательность против идентичности
SQL Server 2012 представлен Sequence
в качестве новой функции, так же, как в Oracle и Postgres. Где последовательности предпочтительнее, чем идентичности? И зачем нам последовательности?
5 ответов
Я думаю, что вы найдете ответ здесь
Используя атрибут идентификации для столбца, вы можете легко генерировать автоматически увеличивающиеся числа (которые так же часто используются в качестве первичного ключа). С Sequence это будет другой объект, который вы можете прикрепить к столбцу таблицы при вставке. В отличие от идентификатора, следующий номер для значения столбца будет извлекаться из памяти, а не с диска - это делает последовательность значительно быстрее, чем идентификатор. Мы увидим это в следующих примерах.
И здесь:
Последовательности. Последовательности запрашиваются сообществом SQL Server годами и включены в этот выпуск. Последовательность - это определенный пользователем объект, который генерирует последовательность числа. Вот пример использования последовательности.
и здесь тоже:
Объект последовательности SQL Server генерирует последовательность чисел, как столбец идентификаторов в таблицах SQL. Но преимущество порядковых номеров в том, что объект порядкового номера не ограничивается одной таблицей sql.
а на msdn вы также можете прочитать больше об использовании и зачем оно нам ( здесь):
Последовательность - это определяемый пользователем объект, связанный со схемой, который генерирует последовательность числовых значений в соответствии со спецификацией, с которой эта последовательность была создана. Последовательность числовых значений генерируется в порядке возрастания или убывания через определенный интервал и может циклически повторяться (повторяться) в соответствии с запросом. Последовательности, в отличие от столбцов идентификаторов, не связаны с таблицами. Приложение обращается к объекту последовательности, чтобы получить его следующее значение. Связь между последовательностями и таблицами контролируется приложением. Пользовательские приложения могут ссылаться на объект последовательности и координировать значения ключей в нескольких строках и таблицах.
Последовательность создается независимо от таблиц с помощью оператора CREATE SEQUENCE. Параметры позволяют контролировать приращение, максимальные и минимальные значения, начальную точку, возможность автоматического перезапуска и кэширование для повышения производительности. Для получения информации о параметрах см. СОЗДАНИЕ ПОСЛЕДОВАТЕЛЬНОСТИ.
В отличие от значений столбцов идентификаторов, которые генерируются при вставке строк, приложение может получить следующий порядковый номер перед вставкой строки, вызвав функцию NEXT VALUE FOR. Порядковый номер присваивается, когда вызывается NEXT VALUE FOR, даже если номер никогда не вставляется в таблицу. Функция NEXT VALUE FOR может использоваться в качестве значения по умолчанию для столбца в определении таблицы. Используйте sp_sequence_get_range, чтобы получить диапазон нескольких порядковых номеров одновременно.
Последовательность может быть определена как любой целочисленный тип данных. Если тип данных не указан, по умолчанию используется значение bigint.
Последовательность и идентификатор используются для генерации автоматического номера, но основное отличие состоит в том, что идентификатор зависит от таблицы, а последовательность не зависит от таблицы.
Если у вас есть сценарий, в котором вам нужно поддерживать автоматический номер в глобальном масштабе (в нескольких таблицах), вам также необходимо перезапустить интервал после определенного числа, и вам необходимо его кешировать также для повышения производительности, вот место, где нам нужна последовательность, а не идентичность.
Ниже приведены статьи, определяющие пример последовательности, ее реализацию, а также разницу между последовательностью и идентичностью.
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 раза быстрее, чем при использовании последовательности для пакетных вставок.
Я вставил около 1,5 млн строк и производительность составила:
- 14 секунд для идентификации
- 45 секунд для последовательности
Я вставил строки в таблицу, которая использовала объект последовательности через таблицу по умолчанию:
NEXT VALUE for <seq> for <col_name>
а также попытался указать значение последовательности в операторе выбора:
SELECT NEXT VALUE for <seq>, <other columns> from <table>
Оба были одним и тем же фактором медленнее, чем метод идентификации. Я использовал опцию кэширования по умолчанию для последовательности.
В статье, на которую ссылается первая ссылка Ариона, показана производительность для построчной вставки, а разница между идентичностью и последовательностью составляла от 16,6 до 14,3 секунды для 10000 вставок.
Опция Кэширование оказывает большое влияние на производительность, но идентификация быстрее для больших томов (+1M строк)
Смотрите эту ссылку для углубленного анализа в соответствии с комментарием utly4life.
Я знаю, что это немного старо, но хотел добавить замечание, которое меня укусило.
Я переключился с идентичности на последовательность, чтобы мои индексы были в порядке. Позже я узнал, что последовательность не переносится с репликацией. Я начал получать ключевые нарушения после настройки репликации между двумя базами данных, поскольку последовательности не были синхронизированы. просто что-то, чтобы не упустить, прежде чем принять решение.
Я считаю, что лучше всего использовать Последовательности не для замены столбца идентификаторов, а для создания поля типа "Номер заказа".
Другими словами, номер заказа предоставляется конечному пользователю и может иметь бизнес-правила вместе с ним. Вы хотите, чтобы он был уникальным, но использование столбца идентификаторов также не совсем корректно.
Например, для разных типов заказов может потребоваться другая последовательность, поэтому у вас может быть последовательность для заказа через Интернет, в отличие от внутренних заказов.
Другими словами, не думайте о последовательности как о простой замене идентичности, думайте о ней как о полезной в тех случаях, когда идентичность не соответствует бизнес-требованиям.
Недавно было кое-что, чтобы рассмотреть для идентичности против последовательности. Кажется, MSFT теперь предлагает последовательность, если вы хотите сохранить идентичность без пробелов. У нас была проблема, в которой были огромные пробелы в идентичности, но на основании этого выделенного утверждения можно было бы объяснить нашу проблему, что SQL кэшировал идентичность, и после перезагрузки мы потеряли эти числа.
Последовательные значения после перезапуска сервера или других сбоев - SQL Server может кэшировать значения идентификаторов по соображениям производительности, а некоторые из назначенных значений могут быть потеряны при сбое базы данных или перезапуске сервера. Это может привести к пробелам в значении идентичности при вставке. Если пропуски неприемлемы, приложение должно использовать собственный механизм для генерации значений ключей. Использование генератора последовательности с опцией NOCACHE может ограничить промежутки между транзакциями, которые никогда не фиксируются.