Les requêtes SQL complexes sont excellentes pour rendre les recherches de base de données très spécifiques et flexibles, mais elles peuvent également être difficiles à comprendre et presque impossibles à déboguer, et vous pourriez aussi bien oublier de les réutiliser.
Lorsque les requêtes vont au-delà de vos commandes SELECT et WHERE standard, vous pouvez même constater que les performances de SQL Server commencent à souffrir car les optimiseurs de requêtes ont du mal à traiter les requêtes longues et complexes.
Si vous remarquez que vos requêtes SQL utilisent un nombre excessif de jointures et de sous-requêtes complexes, imbriquent des requêtes dans des clauses WHERE et s'appuient sur de nombreuses clauses AND et OR, c'est probablement le bon moment pour prendre du recul et chercher des moyens de minimiser une partie de la complexité.
Conseils pour minimiser la complexité des requêtes SQL Server
Comme nous l'avons mentionné ci-dessus, les optimiseurs de requêtes SQL Server n'aiment pas les requêtes SQL complexes. Voici cinq façons de rendre vos requêtes moins complexes afin de les optimiser pour de meilleures performances.
1. Éliminer les clauses OR lorsque cela est possible
Le moyen le plus simple de rendre les requêtes moins complexes consiste à éliminer les clauses OR dans la mesure du possible. Étant donné que OR est inclusif, SQL Server doit traiter chaque composant de la clause séparément, ce qui ralentit considérablement les opérations.
Lorsqu'il n'est pas possible de supprimer OR, la meilleure option consiste à diviser les requêtes longues et complexes en requêtes plus petites. Il semble un peu contre-intuitif que le traitement de plusieurs requêtes soit plus rapide que le traitement d'une seule, mais lorsqu'il s'agit de OU, il vaut mieux opter pour plusieurs requêtes.
2. Affiner les recherches de chaînes
SQL Server fait bien beaucoup de choses, mais les recherches de chaînes floues n'en font pas partie. Les recherches de chaînes génériques, en particulier sur les grandes tables, sont inefficaces et mauvaises pour les performances.
Il existe quelques ajustements que vous pouvez appliquer aux recherches de chaînes pour minimiser l'impact sur les performances.
- Utilisez une chaîne de recherche principale au lieu d'une recherche générique (c'est-à-dire, remplacez " %Pour%" par "Pour%")
- Appliquez des filtres tels que la date ou l'heure à la requête pour réduire la taille des données avant d'exécuter la recherche de chaîne
- Appliquez l'indexation de texte intégral pour générer des index qui permettent une recherche de chaîne flexible sur les colonnes de texte
3. Méfiez-vous des opérations d'écriture volumineuses
Les opérations d'écriture volumineuses provoquent des conflits et génèrent de nombreux fichiers journaux. Si elles ne sont pas contrôlées, les opérations d'écriture volumineuses peuvent bloquer les ressources des utilisateurs et créer des problèmes de latence, ainsi que remplir les journaux de transactions ou même le stockage physique.
Étant donné que vous ne pouvez pas toujours éviter les opérations d'écriture volumineuses, soyez conscient du moment où vous les exécutez (moins le serveur est occupé, mieux c'est) ou réduisez le nombre de lignes modifiées par opération pour minimiser le risque de conflit.
4. Nettoyer les index
Les index sont l'un des principaux coupables en matière de performances médiocres, mais lorsque vous essayez d'optimiser des requêtes SQL complexes, les index nécessitent des considérations particulières.
SQL Server dispose de plusieurs outils qui vous permettent de savoir quand des index manquants affectent les performances des requêtes. Mais avant de vous lancer et de commencer à ajouter des index, vous devez déterminer si l'index supplémentaire améliorera suffisamment la requête pour que cela en vaille la peine. Par exemple, si la requête s'exécute 1 million de fois par jour et que l'index l'améliore de 25 %, cela en vaut probablement la peine. Si la requête est rarement utilisée, elle peut ne pas avoir de sens.
Quelques autres éléments à considérer avant de commencer à ajouter des index sont de savoir si les index existants peuvent être modifiés pour couvrir ce cas d'utilisation sans en ajouter un nouveau et si cet index existe déjà mais que l'optimiseur l'ignore pour une raison quelconque.
D'autres manières dont les index peuvent affecter les performances des requêtes sont la sur-indexation ou la sous-indexation des tables et des tables dépourvues d'index clusterisé ou de clé primaire. La résolution de ces problèmes facilitera les performances des requêtes SQL complexes.
5. Gardez le compte à rebours de la table
Chaque fois que vous ajoutez une table à une requête, la requête devient plus complexe. Des tables excessives entraînent souvent de mauvais plans d'exécution car l'optimiseur de requête ne peut pas fonctionner efficacement.
Si vous remarquez qu'une requête complexe fonctionne mal et comporte de nombreuses tables, c'est peut-être l'un de ces moments où la division de la requête en requêtes plus petites est le meilleur choix, car cela allégera une partie de la charge de l'optimiseur.
Les outils de réglage des performances peuvent aider à réduire la complexité de SQL Server
Lorsque des requêtes complexes enlisent l'optimiseur de requêtes, vous vous retrouvez souvent avec un plan d'exécution inefficace et les performances en souffrent. En plus des conseils ci-dessus, les outils de réglage des performances sont une ressource précieuse pour réduire la complexité des requêtes SQL Server et optimiser les performances.
Vous trouverez ci-dessous quelques-unes des fonctionnalités à rechercher lors de la recherche de solutions de réglage des performances.
Analyse du plan d'exécution SQL Server
L'outil de réglage doit analyser votre plan d'exécution et déterminer ce qui doit changer pour que SQL Server exécute les opérations plus efficacement.
Visualisation du plan d'exécution SQL Server
L'outil de réglage doit présenter le plan d'exécution d'une manière facile à comprendre et vous aider à localiser les opérations qui ralentissent l'exécution.
Optimisation SQL automatisée
L'outil de réglage doit analyser votre SQL, puis le réécrire automatiquement jusqu'à ce qu'il atteigne l'amélioration maximale du temps d'exécution.
Comparaison des instructions SQL optimisées et originales
L'outil de réglage doit mettre en évidence les modifications dans l'instruction SQL afin que vous puissiez comparer les versions d'origine et optimisée avant de déployer les modifications.
Comparaison des plans d'exécution SQL Server
Les outils de réglage doivent fournir une comparaison des plans d'exécution d'origine et optimisés afin que vous sachiez ce qui a changé entre les versions.
Preuve statistique
Votre outil de réglage doit fournir des données indiquant pourquoi le SQL optimisé s'exécute plus rapidement que l'instruction SQL d'origine.
Les requêtes SQL Server complexes peuvent avoir un impact négatif sur les performances du système. Utilisez ces conseils et une solution de réglage des performances de haute qualité pour éliminer la complexité et optimiser l'efficacité de vos requêtes SQL.