如何:在語句層級使用時間移動進行查詢
在 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
的陳述式層級限制時間移動的詳細資訊,請參閱時間移動限制。