Практическое руководство. Запрос с помощью перемещения по времени на уровне инструкции
В Microsoft Fabric возможность перемещения по времени разблокирует возможность запрашивать предыдущие версии данных без необходимости создавать несколько копий данных, экономя на затратах на хранение. В этой статье описывается, как запрашивать таблицы хранилища с помощью перемещения по времени на уровне инструкции с помощью предложения T-SQL OPTION и синтаксиса FOR TIMESTAMP AS OF. Эта функция в настоящее время доступна для предварительного ознакомления.
Таблицы хранилища можно запрашивать до тридцати календарных дней с помощью OPTION
предложения, предоставляя формат yyyy-MM-ddTHH:mm:ss[.fff]
даты.
Следующие примеры можно выполнить в SQL Редактор запросов, SQL Server Management Studio (SSMS), Azure Data Studio или любом редакторе запросов T-SQL.
Примечание.
В настоящее время для перемещения по времени используется только часовой пояс UTC.
Перемещение по времени в таблице склада
В этом примере показано, как перемещаться по отдельной таблице в хранилище.
Предложение OPTION T-SQL указывает точку во времени для возврата данных.
/* Time travel using a SELECT statement */
SELECT *
FROM [dbo].[dimension_customer]
OPTION (FOR TIMESTAMP AS OF '2024-05-02T20:44:13.700');
Перемещение по времени в нескольких таблицах хранилища
Предложение OPTION объявляется один раз на запрос, и результаты запроса отражают состояние данных в метке времени, указанной в запросе для всех таблиц.
SELECT Sales.StockItemKey,
Sales.Description,
CAST (Sales.Quantity AS int)) AS SoldQuantity,
c.Customer
FROM [dbo].[fact_sale] AS Sales INNER JOIN [dbo].[dimension_customer] AS c
ON Sales.CustomerKey = c.CustomerKey
GROUP BY Sales.StockItemKey, Sales.Description, Sales.Quantity, c.Customer
ORDER BY Sales.StockItemKey
OPTION (FOR TIMESTAMP AS OF '2024-05-02T20:44:13.700');
Перемещение по времени в хранимой процедуре
Хранимые процедуры — это набор инструкций SQL, которые предварительно компилируются и хранятся для многократного использования. Предложение OPTION можно объявить один раз в хранимой процедуре, а результирующий набор отражает состояние всех таблиц в указанной метке времени.
Предложение FOR TIMESTAMP AS OF
не может напрямую принимать переменную, так как значения в этом OPTION
предложении должны быть детерминированными. Для передачи строго типизированного значения даты и времени в хранимую процедуру можно использовать sp_executesql. Этот простой пример передает переменную и преобразует параметр datetime в необходимый формат с стилем даты 126.
CREATE PROCEDURE [dbo].[sales_by_city] (@pointInTime DATETIME)
AS
BEGIN
DECLARE @selectForTimestampStatement NVARCHAR(4000);
DECLARE @pointInTimeLiteral VARCHAR(33);
SET @pointInTimeLiteral = CONVERT(VARCHAR(33), @pointInTime, 126);
SET @selectForTimestampStatement = '
SELECT *
FROM [dbo].[fact_sale]
OPTION (FOR TIMESTAMP AS OF ''' + @pointInTimeLiteral + ''')';
EXEC sp_executesql @selectForTimestampStatement
END
Затем можно вызвать хранимую процедуру и передать переменную в качестве строго типизированного параметра. Например:
--Execute the stored procedure
DECLARE @pointInTime DATETIME;
SET @pointInTime = '2024-05-10T22:56:15.457';
EXEC dbo.sales_by_city @pointInTime;
Или, например:
--Execute the stored procedure
DECLARE @pointInTime DATETIME;
SET @pointInTime = DATEADD(dd, -7, GETDATE())
EXEC dbo.sales_by_city @pointInTime;
Перемещение по времени в представлении
Представления представляют сохраненный запрос, который динамически извлекает данные из одной или нескольких таблиц при запросе представления. Предложение OPTION можно использовать для запроса представлений, чтобы результаты отражали состояние данных в метке времени, указанной в запросе.
--Create View
CREATE VIEW Top10CustomersView
AS
SELECT TOP (10)
FS.[CustomerKey],
DC.[Customer],
SUM(FS.TotalIncludingTax) AS TotalSalesAmount
FROM
[dbo].[dimension_customer] AS DC
INNER JOIN
[dbo].[fact_sale] AS FS ON DC.[CustomerKey] = FS.[CustomerKey]
GROUP BY
FS.[CustomerKey],
DC.[Customer]
ORDER BY
TotalSalesAmount DESC;
/*View of Top10 Customers as of a point in time*/
SELECT *
FROM [Timetravel].[dbo].[Top10CustomersView]
OPTION (FOR TIMESTAMP AS OF '2024-05-01T21:55:27.513');
- Исторические данные из таблиц в представлении можно запрашивать только для перемещения по времени, начиная с момента создания представления.
- После изменения представления запросы на поездки во времени действительны только после изменения.
- Если базовая таблица представления изменяется без изменения представления, запросы на поездки по времени в представлении могут возвращать данные до изменения таблицы, как ожидалось.
- Если базовая таблица представления удаляется и создается повторно, не изменяя представление, данные для запросов на поездки по времени доступны только с момента создания таблицы.
Ограничения
Дополнительные сведения об ограничениях по времени на уровне инструкций FOR TIMESTAMP AS OF
см. в разделе "Ограничения на поездки по времени".