En tant que développeur ou administrateur de bases de données SQL Server, vous vous retrouvez souvent dans des situations où la modification des index ou des paramètres du serveur n’est pas une option pour l’optimisation des performances. Dans de tels cas, la réécriture des requêtes peut être une solution viable pour améliorer l’exécution des performances. Dans cet article de blog, nous discuterons de 12 techniques que vous pouvez utiliser pour refactoriser vos requêtes et changer leurs performances.
1. Fonctions de fenêtre vs GROUP BY
Parfois, les fonctions de fenêtre dépendent trop de tempdb et des opérateurs de blocage, ce qui peut avoir un impact sur les performances. Si vous rencontrez des performances médiocres avec les fonctions de fenêtre, envisagez de les réécrire en requêtes GROUP BY à l’ancienne pour obtenir de meilleures performances d’exécution.
2. Sous-requêtes corrélées vs tables dérivées
Les sous-requêtes corrélées sont souvent faciles à comprendre, mais passer à des requêtes avec des tables dérivées peut améliorer les performances en raison de leur nature basée sur les ensembles. Considérez l’utilisation de tables dérivées au lieu de sous-requêtes corrélées pour optimiser l’exécution des requêtes.
3. IN vs UNION ALL
Lorsque vous filtrez des lignes de données sur plusieurs valeurs dans des tables avec des distributions biaisées et des index non couvrants, écrire votre logique en plusieurs instructions jointes avec UNION ALL peut parfois générer des plans d’exécution plus efficaces que l’utilisation de IN ou OR.
4. Tables temporaires de mise en scène
Les requêtes complexes peuvent parfois perturber l’optimiseur de requêtes, ce qui entraîne des plans d’exécution inefficaces. La décomposition d’une requête complexe en plusieurs étapes qui utilisent des tables temporaires de mise en scène peut fournir à SQL Server plus d’informations sur vos données, ce qui conduit à des plans d’exécution plus efficaces.
5. Forcer l’ordre de jointure des tables
Des statistiques obsolètes et des informations insuffisantes peuvent amener l’optimiseur de requêtes SQL Server à joindre les tables dans une séquence moins idéale. Considérez l’utilisation de techniques, telles que celles décrites par Adam Machanic, pour forcer l’ordre de jointure des tables sans recourir à des indications de jointure.
6. DISTINCT avec peu de valeurs uniques
L’utilisation de l’opérateur DISTINCT n’est pas toujours la façon la plus rapide de retourner des valeurs uniques dans un ensemble de données. Considérez l’utilisation de CTE récursives, comme suggéré par Paul White, pour retourner des valeurs distinctes sur de grands ensembles de données avec relativement peu de valeurs uniques.
7. Éliminer les UDF
Les fonctions définies par l’utilisateur (UDF) peuvent souvent entraîner de mauvaises performances de requête en raison de la contrainte de plans séquentiels et des estimations inexactes. Essayez d’intégrer la logique de l’UDF directement dans la requête principale pour améliorer les performances. SQL Server 2019 intègre automatiquement les UDF dans de nombreux cas, mais une intégration manuelle peut être nécessaire pour des performances optimales.
8. Créer des UDF
Dans certains cas, un serveur mal configuré peut paralléliser trop fréquemment les requêtes, ce qui entraîne de moins bonnes performances. Mettre la logique de requête problématique dans une fonction scalaire ou une fonction de table à plusieurs instructions peut forcer cette partie du plan à s’exécuter de manière séquentielle, ce qui peut améliorer les performances.
9. Compression des données
La compression des données permet non seulement d’économiser de l’espace, mais peut également améliorer les performances sur certaines charges de travail. Les données compressées permettent une meilleure vitesse de lecture du disque et augmentent la possibilité pour SQL Server de réutiliser les données déjà en mémoire, ce qui conduit à de meilleures performances.
10. Vues indexées
Si vous ne pouvez pas ajouter de nouveaux index aux tables existantes, envisagez de créer une vue sur ces tables et d’indexer la vue à la place. Cette technique fonctionne bien pour les bases de données de fournisseurs où la modification des objets existants n’est pas autorisée.
11. Changer les estimateurs de cardinalité
Le nouvel estimateur de cardinalité introduit dans SQL Server 2014 améliore les performances de nombreuses requêtes. Cependant, dans certains cas spécifiques, il peut entraîner des performances plus lentes. Utilisez un simple indice de requête pour forcer SQL Server à revenir à l’ancien estimateur de cardinalité lorsque cela est nécessaire.
12. Copier les données
Si tout le reste échoue et que vous ne pouvez pas obtenir de meilleures performances en réécrivant une requête, envisagez de copier les données dont vous avez besoin dans une nouvelle table où vous pouvez créer des index et effectuer d’autres transformations utiles à l’avance.
N’oubliez pas que cette liste de techniques n’est pas exhaustive et que toutes ne fonctionneront pas dans toutes les situations. La clé est de comprendre ce que l’optimiseur de requêtes sait sur vos données et pourquoi il choisit un plan d’exécution particulier. En comprenant ces facteurs, vous pouvez faire preuve de créativité avec différentes réécritures de requêtes pour résoudre les problèmes de performances.
Améliorez vos requêtes avec bonheur!