SSMS
 sql >> Base de données >  >> Database Tools >> SSMS

Étapes possibles pour améliorer les performances des requêtes SQL Server

Première Run la query de Sql Server Management Studio et regardez le plan de requête pour voir où se trouve le goulot d'étranglement. Partout où vous voyez un "balayage de table" ou un "balayage d'index", il doit parcourir toutes les données pour trouver ce qu'il recherche. Si vous créez des index appropriés pouvant être utilisés pour ces opérations, cela devrait augmenter les performances.

Vous trouverez ci-dessous quelques conseils pour améliorer les performances des requêtes sql.

Éviter les jointures multiples dans une seule requête

Essayez d'éviter d'écrire une requête SQL à l'aide de plusieurs jointures qui incluent des jointures externes, des applications croisées, des applications externes et d'autres sous-requêtes complexes. Cela réduit les choix de l'optimiseur pour décider de l'ordre de jointure et du type de jointure. Parfois, Optimizer est obligé d'utiliser des jointures de boucles imbriquées, quelles que soient les conséquences sur les performances des requêtes avec des applications croisées ou des sous-requêtes excessivement complexes.

Éliminer les curseurs de la requête Essayez de supprimer les curseurs de la requête et d'utiliser une requête basée sur un ensemble ; la requête basée sur un ensemble est plus efficace que celle basée sur un curseur. S'il est nécessaire d'utiliser un curseur, évitez les curseurs dynamiques car ils ont tendance à limiter le choix de plans disponibles pour l'optimiseur de requête. Par exemple, le curseur dynamique limite l'optimiseur à l'utilisation de jointures de boucles imbriquées.

Éviter l'utilisation de sous-requêtes scalaires non corrélées Vous pouvez réécrire votre requête pour supprimer la sous-requête scalaire non corrélée en tant que requête distincte au lieu d'une partie de la requête principale et stocker la sortie dans une variable, qui peut être référencée dans la requête principale ou une partie ultérieure du lot. Cela donnera de meilleures options à Optimizer, ce qui peut aider à renvoyer des estimations de cardinalité précises avec un meilleur plan.

Évitez les fonctions multi-instructions à valeur de table (TVF) Les TVF multi-instructions sont plus coûteuses que les TFV en ligne. SQL Server étend les TFV en ligne dans la requête principale comme il étend les vues, mais évalue les TVF à plusieurs instructions dans un contexte distinct de la requête principale et matérialise les résultats de plusieurs instructions dans des tables de travail temporaires. Le contexte et la table de travail séparés rendent coûteux les TVF multi-instructions.

Créer un index hautement sélectif La sélectivité définit le pourcentage de lignes éligibles dans le tableau (nombre de lignes éligibles/nombre total de lignes). Si le rapport entre le nombre de lignes de qualification et le nombre total de lignes est faible, l'index est très sélectif et est des plus utiles. Un index non clusterisé est plus utile si le rapport est d'environ 5 % ou moins, c'est-à-dire si l'index peut éliminer 95 % des lignes de la prise en compte. Si l'index renvoie plus de 5 % des lignes d'une table, il ne sera probablement pas utilisé ; soit un index différent sera choisi ou créé, soit la table sera scannée.

Positionner une colonne dans un index L'ordre ou la position d'une colonne dans un index joue également un rôle essentiel pour améliorer les performances des requêtes SQL. Un index peut aider à améliorer les performances de la requête SQL si les critères de la requête correspondent aux colonnes qui restent le plus dans la clé d'index. En tant que meilleure pratique, la plupart des colonnes sélectives doivent être placées le plus à gauche dans la clé d'un index non clusterisé.

Suppression des index inutilisésLa suppression des index inutilisés peut aider à accélérer les modifications de données sans affecter la récupération des données. En outre, vous devez définir une stratégie pour les processus par lots qui s'exécutent rarement et utilisent certains index. Dans de tels cas, la création d'index avant les traitements par lots, puis leur suppression lorsque les traitements par lots sont terminés permet de réduire la surcharge de la base de données.

Création et mises à jour de statistiques Vous devez vous occuper de la création de statistiques et des mises à jour régulières pour les colonnes calculées et les multi-colonnes référencées dans la requête ; l'optimiseur de requête utilise des informations sur la distribution des valeurs dans une ou plusieurs colonnes d'une statistique de table pour estimer la cardinalité, ou le nombre de lignes, dans le résultat de la requête. Ces estimations de cardinalité permettent à l'optimiseur de requête de créer un plan de requête de haute qualité.

Revisitez vos définitions de schéma Enfin et surtout, revoyez vos définitions de schéma ; gardez à l'esprit que les contraintes FORIGEN KEY, NOT NULL et CEHCK appropriées sont en place ou non. La disponibilité de la bonne contrainte au bon endroit aide toujours à améliorer les performances de la requête, comme la contrainte FORIGEN KEY aide à simplifier les jointures en convertissant certaines jointures externes ou semi-jointures en jointures internes et la contrainte CHECK aide également un peu en supprimant les prédicats inutiles ou redondants.

Référence