Disponible à partir de la version 2016 de SQL Server, « Query Store » est une nouvelle fonctionnalité de base de données. L’une de ses principales fonctions est de stocker les différents plans et temps d’exécution générés pour une même requête. L’analyse des performances est ainsi simplifiée, le DBA pouvant facilement comparer les plans d’exécution générés par le moteur, et même forcer l’exécution d’un plan antérieur plus performant.
L’activation pour une base, ici « FORM » se fait de la manière suivante :
USE [master] GO ALTER DATABASE [FORM] SET QUERY_STORE = ON GO ALTER DATABASE [FORM] SET QUERY_STORE (OPERATION_MODE = READ_WRITE) GO
Par la suite, de nombreuses options relatives au stockage des plans sont disponibles, notamment la fréquence de flush sur disque, l’intervalle de collecte des données ou de rétention. De plus, des rapports pré-construit sont désormais visibles :
Nous allons tester la fonctionnalité en générant différents plans d’exécution sur une table contenant 1 millions de lignes. Nous avons réalisé des updates / deletes sur cette table et désactivé la mise à jour des statistiques pour augmenter sa fragmentation.
SELECT * from dbo.db_form1 WHERE id BETWEEN 200000 AND 350000 ORDER BY id;
Le 1er plan (id 1) de cette requête est généré dans le rapport « principales requêtes consommatrices de ressources ». L’absence d’index sur le filtre « id » impacte négativement les performances.
Nous créons l’index manquant :
CREATE NONCLUSTERED INDEX [IDX_1] ON [dbo].[db_form1]([id]);
et relançons la requête. On constate que le nouveau plan généré (id 24) permet de réduire significativement les lectures logiques. Il est également possible de revenir sur le plan précédent et de forcer son exécution pour notre requête.
SQL Server Query Store permettra ainsi à la fois au DBA d’identifier les requêtes les plus consommatrices de la base, et au développeur de les perfectionner.