Как 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
когда тебе это нужно и возьми то, что тебе дает.