Как 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 в вид.



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

1 ответ:

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

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

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

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

Comments

    Ничего не найдено.