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