如何:在语句级别使用时间旅行进行查询

在 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 的语句级别时间旅行限制的详细信息,请参阅时间旅行限制