Как SQL Server определяет следующее значение в последовательности? - PullRequest
0 голосов
/ 28 апреля 2018

Если вы изменяете последовательность для перезапуска со значением, точно таким же, как ее текущее значение, следующее значение будет тем, которое указано в противоположность текущему значению плюс приращение. Все хорошо, но как движок 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 Ответ

0 голосов
/ 28 апреля 2018

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

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

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

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

...