Как SQL Server определяет следующее значение в последовательности?
Если вы измените последовательность для перезапуска со значением, точно таким же, как его текущее значение, следующее значение будет указано в противоположность текущему значению плюс приращение. Все очень хорошо и хорошо, но как движок SQL Server решает использовать текущее значение вместо добавления инкремента? Я предполагаю, что где-то есть флаг, указывающий на текущее состояние.
Глядя на sys.просмотр последовательностей до и после этой серии событий я наблюдал только измените столбцы objects modify_date и start_value после инструкции ALTER SEQUENCE. Получение следующего значения изменяет столбец current_value только после того, как второе следующее значение выбрано либо из изначально созданной последовательности, либо из последовательности ALTER...Заявление о перезапуске.
Вот пример для демонстрации (столбец 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
Никаких изменений в системе не наблюдается.просмотр последовательностей.
SELECT NEXT VALUE FOR abc; -- 11
modify_date current_value increment start_value
---------------- ------------- ----------- -----------
17:40:17.42 11 2 9
Последовательность теперь продолжается, как и ожидалось, с изменением только current_value в вид.
Так что кто-нибудь знает, верна ли моя теория флага и, если да, то где этот флаг находится (т. е. находится ли он в доступном системном представлении).
1 ответ:
Так кто-нибудь знает, верна ли моя теория флага, и если да, то где этот флаг находится (то есть находится в доступном системном представлении).
Да-похоже, что это, вероятно, правильно. Но не в очень доступном системном представлении.
Если вы подключаетесь через DAC, вы можете запустить
SELECT value FROM sys.sysobjvalues WHERE objid = OBJECT_ID('abc');Вот как это выглядит после достижения 9 органически после увеличения последовательности в 4 раза (и установки базы данных в автономном режиме для обеспечения всех кэшированных изменений, записанных в диск).
0x030000000000000002000000000000000000000000000080FFFFFFFFFFFFFF7F090000000000000000А вот как это выглядит после бега
ALTER SEQUENCE abc RESTART WITH 9;Я полагаю, что изменение в самом начале (от0x090000000000000002000000000000000000000000000080FFFFFFFFFFFFFF7F09000000000000000103до09) происходит потому, чтоSTART WITHтеперь изменилось. И последний байт имеет флаг, который вы ищете., но почему тебя это волнует? Любая попытка вычислить следующее значение будет чревата расовыми условиями и негарантированным поведением. Вы должны просто позвонить
NEXT VALUE, когда вам это нужно, и взять то, что он дает вам.
Comments