Je rencontre un problème étrange lors de l'accès aux enregistrements historiques dans une table temporelle. Les requêtes qui accèdent aux anciennes entrées de la table temporelle via la sous-clause AS OF prennent plus de temps que les requêtes sur les entrées d'historique récentes.
La table historique a été générée par SQL Server (comprend un index clusterisé sur les colonnes de date et utilise la compression de page), j'ai ajouté 50 millions de lignes à la table historique et mes requêtes récupéraient environ 25 000 lignes.
J'ai essayé de déterminer la cause première du problème, mais je n'ai pas pu l'identifier. Jusqu'à présent, j'ai testé:
- Création d'une table de test avec 50 millions de lignes avec un index clusterisé pour voir si le ralentissement était simplement dû au volume. J'ai pu récupérer 25 000 lignes à temps constant (~ 400 ms).
- Suppression de la compression de page du tableau historique. Cela n'a eu aucun effet sur le temps de récupération, mais a considérablement augmenté la taille de la table.
- J'ai essayé d'accéder aux lignes de la table d'historique directement en utilisant une colonne ID par rapport aux colonnes de date. C'est là que les choses étaient un peu plus intéressantes. Je pouvais accéder aux anciennes lignes du tableau à ~ 400 ms, comme pour la sous-clause AS OF, cela prendrait ~ 1200 ms. J'ai essayé de filtrer sur ma table de test sur la colonne date et j'ai remarqué un ralentissement similaire par rapport au filtrage sur la colonne ID. Cela m'amène à croire que les comparaisons de dates sont à l'origine d'une partie du ralentissement.
Je veux regarder plus loin, mais je veux aussi m'assurer que je n'aboie pas dans le mauvais arbre. Premièrement, quelqu'un d'autre a-t-il connu ce même comportement lors de l'accès à des données historiques plus anciennes dans une table temporelle (nous avons seulement remarqué que les ralentissements dépassaient 10 millions de lignes)? Deuxièmement, quelles sont les stratégies que je peux utiliser pour isoler davantage la cause première du problème de performances (je viens de commencer à étudier les plans d'exécution, mais c'est toujours un peu cryptique pour moi)?
Plans d'exécution
Il s'agit de requêtes de récupération simples: la première accède aux anciennes lignes, la seconde accède aux nouvelles lignes.
Lignes plus anciennes ~ temps d'exécution de 1200 ms
Lignes récentes ~ temps d'exécution de 350 ms
Détails du tableau
Ce sont les colonnes du tableau temporel. La table d'historique a les mêmes colonnes mais n'a pas de clé primaire (selon les exigences de la table d'historique):