Aide et astuces : interroger à l’aide d’un temps de trajet au cours d’une instruction
Dans Microsoft Fabric, la possibilité d’utiliser un temps de trajet permet d’interroger les versions antérieures des données sans avoir à générer de multiples copies de données, ce qui permet d’économiser sur les coûts de stockage. Cet article décrit comment interroger les tables de l’entrepôt en utilisant le temps de trajet au cours d’une instruction, au moyen de la clause OPTION T-SQL et la syntaxe FOR TIMESTAMP AS OF. Actuellement, cette fonctionnalité est uniquement disponible en tant que version préliminaire.
Les tables de l’entrepôt peuvent être interrogées sur une période de rétention de trente jours calendaires au maximum à l’aide de la clause OPTION
, en indiquant le format de date yyyy-MM-ddTHH:mm:ss[.fff]
.
Les exemples suivants peuvent être exécutés dans l’Éditeur de requête SQL, SQL Server Management Studio (SSMS), Azure Data Studio ou tout autre Éditeur de requête T-SQL.
Remarque
Actuellement, seul le fuseau horaire UTC (Temps universel coordonné) est utilisé pour le temps de trajet.
Temps de trajet sur une table d’entrepôt
Cet exemple décrit la manière de parcourir le temps de trajet sur une table individuelle dans l’entrepôt.
La clause OPTION T-SQL spécifie le point dans le temps pour rendre les données.
/* Time travel using a SELECT statement */
SELECT *
FROM [dbo].[dimension_customer]
OPTION (FOR TIMESTAMP AS OF '2024-05-02T20:44:13.700');
Temps de trajet sur plusieurs tables d’entrepôt
La clause OPTION est déclarée une fois par une requête et les résultats de la requête reflètent l’état des données à l’horodateur spécifié dans la requête pour toutes les tables.
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');
Temps de trajet dans une procédure stockée
Les procédures stockées sont un ensemble d’instructions SQL précompilées et stockées de manière à pouvoir être utilisées à plusieurs reprises. La clause OPTION peut être déclarée une fois dans la procédure stockée, et le jeu de résultats reflète l’état de toutes les tables à l’horodateur spécifié.
La clause FOR TIMESTAMP AS OF
ne peut pas accepter directement une variable, car les valeurs de cette clause OPTION
doivent être déterministes. Vous pouvez utiliser sp_executesql pour transférer une valeur DateHeure fortement typée à la procédure stockée. Cet exemple simple transfère une variable et convertit le paramètre DateHeure au format nécessaire avec le style de date 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
Ensuite, vous pouvez appeler la procédure stockée et transférer une variable en tant que paramètre fortement typé. Par exemple :
--Execute the stored procedure
DECLARE @pointInTime DATETIME;
SET @pointInTime = '2024-05-10T22:56:15.457';
EXEC dbo.sales_by_city @pointInTime;
Ou, par exemple :
--Execute the stored procedure
DECLARE @pointInTime DATETIME;
SET @pointInTime = DATEADD(dd, -7, GETDATE())
EXEC dbo.sales_by_city @pointInTime;
Temps de trajet dans une vue
Les vues représentent une requête enregistrée qui récupère dynamiquement les données d’une ou de plusieurs tables chaque fois que la vue est interrogée. La clause OPTION peut être utilisée pour interroger les vues afin que les résultats reflètent l’état des données à l’horodateur spécifié dans la requête.
--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');
- Les données historiques des tables d’une vue peuvent être interrogées seulement pour le voyage dans le temps à partir du moment où la vue a été créée.
- Une fois qu’une vue est modifiée, les requêtes de voyage dans le temps sont valides seulement après qu’elle a été modifiée.
- Si une table sous-jacente d’une vue est modifiée sans que la vue soit modifiée, les requêtes de voyage dans le temps sur la vue peuvent retourner les données d’avant la modification de la table, comme attendu.
- Quand la table sous-jacente d’une vue est supprimée puis recréée sans que la vue soit modifiée, les données pour les requêtes de voyage dans le temps sont disponibles seulement à partir du moment où la table a été recréée.
Limites
Pour plus d’informations sur les limitations des temps de trajet au niveau des instructions avec FOR TIMESTAMP AS OF
, consultez Limitations des temps de trajet.