Правильные значения для SYSTEM_TIME, чтобы получить правильный снимок таблицы? - PullRequest
0 голосов
/ 26 марта 2020

Я создал временную таблицу для отслеживания некоторых значений клиента.

CREATE TABLE [ana].[CLV](
    [CustomerID] [varbinary](400) NOT NULL,
    [Lifelength] [numeric](9, 6) NULL,
    [CountOrders] [int] NULL,
    [TotalCLV] [float] NULL,
    [SysStartTime] [datetime2](7) GENERATED ALWAYS AS ROW START NOT NULL,
    [SysEndTime] [datetime2](7) GENERATED ALWAYS AS ROW END NOT NULL,
PRIMARY KEY CLUSTERED 
(
    [CustomerID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],
    PERIOD FOR SYSTEM_TIME ([SysStartTime], [SysEndTime])
) ON [PRIMARY]
WITH
(
SYSTEM_VERSIONING = ON ( HISTORY_TABLE = [ana].[CLVHistory] )
)
GO

Цель состоит в том, чтобы получить снимок всей таблицы в указанной точке c вовремя, а не для отдельных записей.

Вот как я организовал свой тест: я создал небольшой скрипт для обновления таблицы с другими операторами. В начале и в конце каждого запуска сценария я записываю метки времени и сохраняю их в отдельной таблице для будущего использования.

Первый запуск этого сценария:

  1. Сохранить отметка времени начала
  2. Вставьте 5 строк и укажите все возможные значения, кроме идентификатора клиента, значение 1.
  3. Пятисекундная ложная задержка
  4. Сохранить конечную метку времени

Второй запуск будет

  1. Сохранить начальную метку времени
  2. Вставьте новую строку, обновите две существующие строки и удалите строку. Задайте для вставленных и обновленных строк значения 2.
  3. Пятисекундная ложная задержка
  4. Сохранение конечной отметки времени

Итак, к этому времени в моей ссылке В таблице будет две строки с их собственными отметками времени начала и конца

RunId, Start, End
1, X1, Y1
2, X2, Y2

Теперь, если я хочу посмотреть, как выглядела вся таблица сразу после первого обновления (то есть когда было 5 строк с все значения, установленные на 1), использование Y1 для SYSTEM_TIME не дает мне этих данных.

SELECT * FROM [ana].[CLV] FOR SYSTEM_TIME AS OF Y1

Однако, есть другой способ получить снимок, который смотрит на один из строки, которые не были обновлены во втором запуске (те, которые все еще сохраняют значение 1), а затем вставляют их значение SysStartTime для вышеуказанного запроса. Но это не отвечает на вопрос, потому что каждый запуск скрипта может содержать много операторов.

Так какое же правильное значение использовать для SYSTEM_TIME?

ОБНОВЛЕНИЕ:

Я использовал следующий подход, и он, похоже, пока дает мне правильный снимок. Но я был бы признателен за ваше мнение, поскольку я не уверен на 100%:

Вместо сохранения меток времени в начале и конце каждого обновления я сохраняю только одно значение DATETIME2, то есть MAX(SysStartTime) из основного временная (не история) таблица.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...