방법: 문 수준에서 시간 이동으로 쿼리
Microsoft Fabric에서 시간 이동 기능을 사용하면 여러 데이터 복사본을 생성할 필요 없이 이전 버전의 데이터를 쿼리할 수 있어 스토리지 비용이 절감됩니다. 이 문서에서는 T-SQL OPTION 절 및 FOR TIMESTAMP AS OF 구문을 사용하여 문 수준에서 시간 이동을 사용하여 웨어하우스 테이블을 쿼리하는 방법을 설명합니다. 이 기능은 현재 프리뷰 상태입니다.
웨어하우스 테이블은 OPTION
절을 사용하여 30일의 보존 기간까지 쿼리할 수 있으며, 날짜 형식은 yyyy-MM-ddTHH:mm:ss[.fff]
입니다.
다음 예시는 SQL 쿼리 편집기, SSMS(SQL Server Management Studio), 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 절은 저장 프로시저에서 한 번 선언할 수 있으며, 결과 집합에는 지정된 타임스탬프에 있는 모든 테이블의 상태가 반영됩니다.
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;
보기에서의 시간 이동
보기는 보기를 쿼리할 때마다 하나 이상의 테이블에서 동적으로 데이터를 검색하는 저장된 쿼리를 나타냅니다. 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
의 문 수준 제한 사항의 시간 이동에 대한 자세한 내용은 시간 이동 제한을 참조 하세요.