Leggere in inglese

Condividi tramite


Procedura: Eseguire query usando il tempo di spostamento a livello di istruzione

In Microsoft Fabric, la possibilità di eseguire time travel consente di eseguire query sulle versioni precedenti dei dati senza dover generare più copie di dati, risparmiando sui costi di archiviazione. Questo articolo descrive come eseguire query sulle tabelle del magazzino usando il time travel a livello di istruzione, usando la clausola OPTION di T-SQL e la sintassi FOR TIMESTAMP AS OF. Questa funzionalità è attualmente disponibile solo in anteprima.

È possibile eseguire query sulle tabelle del magazzino fino a un periodo di conservazione di trenta giorni di calendario usando la clausola OPTION, specificando il formato di data yyyy-MM-ddTHH:mm:ss[.fff].

Gli esempi seguenti possono essere eseguiti in SQL Editor di query, SQL Server Management Studio (SSMS), Azure Data Studio o qualsiasi editor di query T-SQL.

Nota

Attualmente, per il time travel, viene usato solo il fuso orario Coordinated Universal Time (UTC).

Time travel su una tabella magazzino

In questo esempio viene illustrato come eseguire un time travel in una singola tabella nel magazzino.

La clausola OPTION di T-SQL specifica il punto temporale per restituire i dati.

/* Time travel using a SELECT statement */
SELECT *
FROM [dbo].[dimension_customer]
OPTION (FOR TIMESTAMP AS OF '2024-05-02T20:44:13.700');

Time travel su più tabelle di magazzino

La clausola OPTION viene dichiarata una volta per ogni query e i risultati della query rifletteranno lo stato dei dati in corrispondenza del timestamp specificato nella query per tutte le tabelle.

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');

Time travel in una stored procedure

Le stored procedure sono un set di istruzioni SQL precompilate e archiviate in modo che possano essere usate ripetutamente. La clausola OPTION può essere dichiarata una sola volta nella stored procedure e il set di risultati riflette lo stato di tutte le tabelle nel timestamp specificato.

La clausola FOR TIMESTAMP AS OF non può accettare direttamente una variabile, perché i valori di questa clausola OPTION devono essere deterministici. È possibile usare sp_executesql per passare un valore datetime fortemente tipizzato alla stored procedure. Questo semplice esempio passa una variabile e converte il parametro datetime nel formato necessario con lo stile di data 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

È quindi possibile chiamare la stored procedure e passare una variabile come parametro fortemente tipizzato. Ad esempio:

--Execute the stored procedure
DECLARE @pointInTime DATETIME;
SET @pointInTime = '2024-05-10T22:56:15.457';
EXEC dbo.sales_by_city @pointInTime;

O ad esempio:

--Execute the stored procedure
DECLARE @pointInTime DATETIME;
SET @pointInTime = DATEADD(dd, -7, GETDATE())
EXEC dbo.sales_by_city @pointInTime;

Time travel in una vista

Le viste rappresentano una query salvata che recupera in modo dinamico i dati da una o più tabelle ogni volta che viene eseguita una query sulla vista. La clausola OPTION può essere usata per eseguire query sulle viste in modo che i risultati riflettano lo stato dei dati in corrispondenza del timestamp specificato nella query.

--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'); 
  • I dati cronologici delle tabelle in una vista possono essere sottoposti a query solo per il viaggio di tempo a partire dal momento in cui è stata creata la vista.
  • Dopo la modifica di una visualizzazione, le query di spostamento temporale sono valide solo dopo la modifica.
  • Se una tabella sottostante di una vista viene modificata senza modificare la visualizzazione, le query di spostamento temporale nella vista possono restituire i dati da prima della modifica della tabella, come previsto.
  • Quando la tabella sottostante di una vista viene eliminata e ricreata senza modificare la vista, i dati per le query di spostamento temporale sono disponibili solo dal momento in cui la tabella è stata ricreata.

Limiti

Per altre informazioni sulle limitazioni del time travel a livello di istruzione con FOR TIMESTAMP AS OF, vedere Limitazioni del time travel.