Как SQL Server определяет следующее значение в последовательности?

Если вы изменяете последовательность для перезапуска со значением, точно совпадающим с ее текущим значением, следующее значение будет тем, которое указано в отличие от текущего значения плюс приращение. Все очень хорошо, но как движок SQL Server определяет использование текущего значения вместо добавления приращения? Я предполагаю, что где-то есть флаг для обозначения текущего статуса.

Глядя на представление sys.sequence до и после этой серии событий, я наблюдал только изменение в столбцах объектов modify_date и start_value после оператора ALTER SEQUENCE. Получение значения NEXT VALUE изменяет столбец current_value только после того, как выбрано второе значение NEXT VALUE из создаваемой последовательности или оператора ALTER SEQUENCE...RESTART.

Вот пример, чтобы продемонстрировать (столбец modify_date только показан как время):

CREATE SEQUENCE abc START WITH 3 INCREMENT BY 2;

modify_date      current_value increment   start_value
---------------- ------------- ----------- -----------
17:39:57.04      3             2           3

Создана последовательность, а в столбце current_value показано следующее значение, которое будет использоваться в последовательности.

SELECT NEXT VALUE FOR abc;  -- 3
SELECT NEXT VALUE FOR abc;  -- 5
SELECT NEXT VALUE FOR abc;  -- 7
SELECT NEXT VALUE FOR abc;  -- 9

modify_date      current_value increment   start_value
---------------- ------------- ----------- -----------
17:39:57.04      9             2           3

Значение current_value теперь показывает последнее использованное значение, т.е. следующим значением будет текущее значение плюс приращение.

ALTER SEQUENCE abc RESTART WITH 9;

modify_date      current_value increment   start_value
---------------- ------------- ----------- -----------
17:40:17.42      9             2           9

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

SELECT NEXT VALUE FOR abc;  -- 9

modify_date      current_value increment   start_value
---------------- ------------- ----------- -----------
17:40:17.42      9             2           9

В представлении sys.sequence изменений не наблюдается.

SELECT NEXT VALUE FOR abc;  -- 11

modify_date      current_value increment   start_value
---------------- ------------- ----------- -----------
17:40:17.42      11            2           9

Последовательность теперь продолжается, как и ожидалось, с изменением только current_value в представлении.

Так кто-нибудь знает, верна ли моя теория флагов и, если это так, где находится этот флаг (т. Е. Находится ли он в доступном системном представлении)

1 ответ

Решение

Так кто-нибудь знает, верна ли моя теория флагов и, если это так, где находится этот флаг (т. Е. Находится ли он в доступном системном представлении).

Да, похоже, это правильно. Но не в очень доступном системном представлении.

Если вы подключаетесь через ЦАП, вы можете запустить

SELECT value
FROM   sys.sysobjvalues
WHERE  objid = OBJECT_ID('abc');

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

0x030000000000000002000000000000000000000000000080FFFFFFFFFFFFFF7F090000000000000000

А вот как это выглядит после бега ALTER SEQUENCE abc RESTART WITH 9;

0x090000000000000002000000000000000000000000000080FFFFFFFFFFFFFF7F090000000000000001

Я представляю изменения в самом начале (из 03 в 09) потому что START WITH сейчас изменилось. И последний байт имеет флаг, который вы ищете.

Но почему тебя это волнует? Любая попытка вычислить следующее значение будет чревата условиями гонки и негарантированным поведением. Вы должны просто позвонить NEXT VALUE когда тебе это нужно и возьми то, что тебе дает.

Другие вопросы по тегам