如何:在语句级别使用时间旅行进行查询
在 Microsoft Fabric 中,时间旅行功能可解锁查询以前数据版本的功能,而无需生成多个数据副本,从而节省存储成本。 本文介绍如何使用语句级别的时间旅行、使用 T-SQL OPTION 子句 和 FOR TIMESTAMP AS OF 语法查询仓库表。 此功能目前以预览版提供。
可以使用 OPTION
子句查询仓库表,可查询的最长保留期为 30 个日历日,并提供日期格式 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 值传递给存储过程。 此简单示例传递变量并将 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
的语句级别时间旅行限制的详细信息,请参阅时间旅行限制。