次の方法で共有


使い方: ステートメント レベルでタイム トラベルを使用してクエリを実行する

Microsoft Fabric では、タイム トラベル機能によって以前のバージョンのデータに対してクエリを実行でき、複数のデータ コピーを生成する必要がなくなるため、ストレージ コストを節約できます。 この記事では、T-SQL OPTION 句FOR TIMESTAMP AS OF 構文を使って、ステートメント レベルでのタイム トラベルを使用してウェアハウス テーブルにクエリを実行する方法について説明します。 現在、この機能はプレビュー段階にあります。

ウェアハウス テーブルに対しては、日付形式 yyyy-MM-ddTHH:mm:ss[.fff] を指定した OPTION 句を使用して最大 30 日間の保持期間中にクエリを実行できます。

次の例は、SQL クエリ エディターSQL Server Management Studio (SSMS)Azure Data Studio、または任意の T-SQL クエリ エディターで実行できます。

Note

現在、タイム トラベルには協定世界時 (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 句はクエリごとに 1 回宣言し、クエリの結果には、すべてのテーブルに対するそのクエリで指定されたタイムスタンプの時点でのデータの状態が反映されます。

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 句はストアド プロシージャで 1 回宣言でき、結果セットには、指定されたタイムスタンプの時点でのすべてのテーブルの状態が反映されます。

この OPTION 句の値は決定論的でなければならないので、FOR TIMESTAMP AS OF 句は変数を直接受け入れることはできません。 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;

ビューでのタイム トラベル

ビューは、ビューに対してクエリが実行されるたびに、1 つ以上のテーブルからデータを動的に取得する保存済みクエリを表します。 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 を使用したステートメント レベルのタイム トラベルに関する制限事項の詳細については、「タイム トラベルの制限事項」を参照してください。