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


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, навіть якщо номер ніколи не вставляється в таблицю. Функцію NEXT VALUE FOR можна використовувати як значення за замовчуванням для стовпця у визначенні таблиці. Використовуйте sp_sequence_get_range, щоб отримати діапазон кількох порядкових номерів одночасно.

Послідовність може бути визначена як будь-який цілочисельний тип даних. Якщо тип даних не вказаний, послідовність за замовчуванням має значення bigint.


21

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

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


14

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

Я виявив, що ефективність використання ідентичності була втричі швидшою, ніж використання послідовності для пакетних вставок.

Я вставив приблизно 1,5 мільйона рядків, і продуктивність була такою:

  • 14 секунд для ідентичності
  • 45 секунд для послідовності

Я вставив рядки в таблицю, яка використовувала об'єкт послідовності, за замовчуванням таблиці:

NEXT VALUE for <seq> for <col_name>

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

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

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

Стаття, на яку посилається перше посилання Аріона, показує ефективність вставки за рядком, а різниця між ідентичністю та послідовністю становила 16,6 секунд до 14,3 секунди для 10000 вставок.

Варіант кешування має великий вплив на продуктивність, але ідентифікація швидша для більших обсягів (+ 1 млн рядків)

Дивіться це посилання для поглибленого аналізу відповідно до коментаря utly4life.


Яким був розмір кешу послідовності.
Шеннон Северанс,

50, збільшуючи, це робить різницю, але я пам’ятаю, ідентичність все-таки була швидшою.
Stagg

2
byobi.com/blog/2012/09/… Забезпечує гарне детальне порівняння різних конфігурацій. Шоу, що збільшення розміру кешу з 50 до 500 дало приблизно вдвічі більшу різницю в швидкості.
ulty4life

Ви припускаєте, що послідовності повільніші за стовпець ідентичності? У мене склалося протилежне враження, оскільки послідовності знаходяться в пам'яті, на відміну від ідентифікаційних даних, які отримуються з диска. Ваші висновки досить дивовижні. Радий, що ви поділилися.
RBT

1
з послідовністю ви можете оптимізувати продуктивність вставки пакетів, використовуючи, alter sequence increment by ...щоб просто звільнити місце для нових рядків, а потім використовувати base + row_number () або інше для фактичних значень.
Горді

5

Я знаю, що це трохи старе, але хотів додати спостереження, яке мене вкусило.

Я перейшов з ідентичності на послідовність, щоб впорядкувати свої індекси. Пізніше я з'ясував, що послідовність не передається з реплікацією. Ключові порушення я почав отримувати після налаштування реплікації між двома базами даних, оскільки послідовності не синхронізувались. просто те, на що слід подбати, перш ніж приймати рішення.


3

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

Іншими словами, номер замовлення доступний кінцевому користувачеві, і разом із ним можуть бути ділові правила. Ви хочете, щоб це було унікально, але просто використання стовпця посвідчення також насправді не є правильним.

Наприклад, для різних типів замовлень може знадобитися інша послідовність, тому у вас може бути послідовність для замовлення в Інтернеті, на відміну від внутрішніх замовлень.

Іншими словами, не думайте про послідовність як просту заміну ідентичності, вважайте її корисною у випадках, коли ідентичність не відповідає вимогам бізнесу.


1

Нещодавно покусав щось для розгляду щодо ідентичності проти послідовності. Здається, 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 може обмежити прогалини транзакцій, які ніколи не фіксуються.


1
Існує досить хороша відповідь на те, чому ви пропускаєте посилання наIDENTITY цифри і має ту ж проблему, що і описана тут посилання, але ви можете обмежити його, встановивши менший розмір КЕШУ, але тоді відбувається компроміс зі швидкістю. SEQUENCE
Мрфін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.