Послідовність повторного використання


11

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

Минулого тижня ми помітили, що він починає повторно використовувати значення.

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

Так, наприклад, я міг отримати щось подібне:

10112
+10113
10114
10 115
10116
10 117
+10118
+10113
10114
10 115
10116
...

Здається, не існує жодної схеми, коли це відбувається, тривалість між першим використанням і другим використанням (всього 10 хв. Або кілька годин) або кількість повернутих назад (цілих 1 і кілька сотень).

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

Хтось має уявлення про те, що може спричинити відхилення послідовності та повторне використання значень щовечора?

ОНОВЛЕННЯ: Щоб відповісти на кілька запитань у коментарях:

  • @@Version:

    Microsoft SQL Server 2012 (SP1) - 11.0.3000.0 (X64) 19 жовтня 2012 13:38:57

  • Створити сценарій:

    CREATE SEQUENCE [schemaName].[SequenceName] 
      AS [bigint]
      START WITH 410014104
      INCREMENT BY 1
      MINVALUE 410000000
      MAXVALUE 419999999
      CYCLE 
      CACHE 
    GO
  • У мене немає унікального обмеження (але я планую його вкласти). Однак це допоможе мені знати лише тоді, коли я повторно використав значення. Не те, що спричинило скидання значень. Я поставив роботу, яка б отримувала нову цінність кожні 5 хв, заощаджуючи її. Скачки часу та вартості не відповідають шаблону.

  • Я перевірив Журнали подій, щоб побачити, чи є помилка. Єдина думка, що відбувається: http://support.microsoft.com/kb/2793634 Ми застосовуємо виправлення сьогодні. Я не думаю, що це пов'язано, але це могло бути.

1
Чому в цьому стовпці не існує ПК або Єдиного обмеження? Якщо це на місці, це повторне використання буде спіймане, і вам не доведеться намагатися вгадати, звідки воно походить, якщо тільки ваш додаток не поглине всі помилки ...
Аарон Бертран


Чи можете ви показати визначення своєї послідовності? Ви також можете перевірити журнал помилок, щоб побачити, чи відбулися якісь значні події протягом ночі (наприклад, аварійне перезавантаження, перезапуск послуги, проблеми з пам’яттю тощо)?
Аарон Бертран

2
Що таке @@VERSION? Чи щось змінилося щодо навколишнього середовища? Існує елемент з'єднання, який повідомляє про щось подібне. ОП там вважає, що це було пов'язано11.0.3000.0
Мартін Сміт,

2
Ну, CYCLE по суті каже SQL Server, що ви добре з повторним використанням значень. Я абсолютно не маю уявлення, чому у вас виникає ця проблема, і не знаю, що ви дізнаєтесь чому (скільки часу ви витрачаєте на дослідження, чому ви отримали плоску шину, перш ніж просто замінити її?). Я все ще думаю, що найкраще поставити там обмеження для запобігання дублікатів та вимкнення кешування в надії запобігти повторному використанню.
Аарон Бертран

Відповіді:


11

По-перше, якщо ви не хочете дублікатів у цьому стовпці, вкажіть це прямо .

ALTER TABLE dbo.whatever ADD CONSTRAINT uq_that_column UNIQUE (that_column);

(Або ви можете зробити це первинним ключем, або змінити кластерний індекс, або що у вас є ...)

У будь-якому випадку, помилка під час створення дубліката набагато краща, ніж просто сліпо вставлення дубліката, з яким вам просто доведеться розібратися пізніше.

Далі, врахуйте, що SEQUENCE - це просто генератор чисел, і за замовчуванням він має кеш-пам'ять у 50 значень. Залежно від того, як налаштовані ваші транзакції та які інші критичні події відбуваються на сервері, можливо, SQL Server може «забути», що він створив певні значення для вас. Вибачте, але я не знаю, які саме критерії впливають на відтворення цієї помилки. Спосіб обійти це (поки ця помилка не буде вирішена / пояснено ), щоб змінити послідовність для використання NO CYCLEі NO CACHE, наприклад:

ALTER SEQUENCE dbo.mysequence NO CYCLE NO CACHE; 

Зауважте, що NO CACHEможе вплинути на продуктивність та одночасність, але допоможе усунути прогалини, втрачені блоки та, хто знає, можливо, і вашу проблему.

Ви також можете переконатися, що ви перебуваєте на останньому пакеті обслуговування та на CU. На даний момент я рекомендую SP1 та CU10 з 3437 ; Пакет SP2 відсутній, але все ще існує важлива проблема з перебудовами в Інтернеті, які можуть торкнутися вас .


Ну, я не можу це створити резервну копію. Тож якщо NO CACHE це не виправить, то я це зроблю.
Ваккано

Я думав, що це може спричинити транзакції. Але на сторінці «Послідовність» на MSDN написано: «Послідовні номери генеруються за межами поточної транзакції. Вони споживаються, незалежно від того, чи здійснена транзакція, що використовує порядковий номер, чи повернута назад». Тому я відкинув свою теорію транзакцій. Я погоджуюся, що має бути ще щось.
Ваккано

Виявляється, достатньо лише встановити його NO CYCLE. (Принаймні, це не сталося минулої ночі.) Дякую за допомогу!
Ваккано

1
Виправлення: Об'єкт послідовності генерує повторювані значення послідовності, коли SQL Server 2012 або SQL Server 2014 знаходиться під тиском пам’яті. Припустимо, що ви створюєте об’єкт послідовності, у якому включена опція CACHE в Microsoft SQL Server 2012 або SQL Server 2014. Коли екземпляр знаходиться під тиском пам'яті , і багато паралельних з'єднань запитують значення послідовностей з одного і того ж об'єкта послідовності, можуть бути створені повторювані значення послідовностей. Крім того, помилка порушення унікального або первинного ключа (ПК) виникає, коли значення таблиці, що повторюється, вставляється в таблицю.
Андомар
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.