Quelles étapes doivent être nécessaires pour optimiser une requête peu performante ?

StackOverflow https://stackoverflow.com/questions/61008

  •  09-06-2019
  •  | 
  •  

Question

Je sais que c'est une question vaste, mais j'ai hérité de plusieurs performances médiocres et je dois mal les optimiser.Je me demandais quelles sont les étapes les plus courantes à optimiser.Alors, quelles mesures certains d’entre vous prennent-ils lorsqu’ils sont confrontés à la même situation ?

Question connexe :
Quelles techniques génériques peuvent être appliquées pour optimiser les requêtes SQL ?

Était-ce utile?

La solution

  1. Regardez le plan d'exécution dans l'analyseur de requêtes
  2. Découvrez quelle étape coûte le plus cher
  3. Optimisez l'étape !
  4. Revenir à l'étape 1 [merci à Vinko]

Autres conseils

Dans SQL Server, vous pouvez consulter le plan de requête dans Query Analyzer ou Management Studio.Cela vous indiquera le pourcentage approximatif de temps passé dans chaque lot de relevés.Vous souhaiterez rechercher les éléments suivants :

  • Analyses de tableaux ;cela signifie qu'il vous manque complètement des index
  • Analyses d'index ;votre requête n'utilise peut-être pas les bons index
  • L'épaisseur des flèches entre chaque étape d'une requête vous indique combien de lignes sont produites par cette étape, des flèches très épaisses signifient que vous traitez un grand nombre de lignes et peuvent indiquer que certaines jointures doivent être optimisées.

Quelques autres conseils généraux :

  • Un grand nombre d'instructions conditionnelles, telles que plusieurs instructions if-else, peuvent amener SQL Server à reconstruire constamment le plan de requête.Vous pouvez vérifier cela à l’aide de Profiler.
  • Assurez-vous que différentes requêtes ne se bloquent pas, comme une instruction update bloquant une instruction select.Cela peut être évité en spécifiant l'indice (nolock) dans les instructions de sélection de SQL Server.
  • Comme d'autres l'ont mentionné, essayez l'assistant de réglage des performances dans Management Studio.

Enfin, je vous recommande fortement de créer un ensemble de tests de charge (à l'aide de Visual Studio 2008 Test Edition), que vous pouvez utiliser pour simuler le comportement de votre application lorsque vous traitez un grand nombre de requêtes.Certains goulots d'étranglement des performances SQL ne se manifestent que dans ces circonstances, et le fait de pouvoir les reproduire facilite grandement leur résolution.

Les index peuvent être un bon point de départ...

Les fruits à portée de main peuvent être renversés avec le serveur SQL Indice Assistant de réglage.

Je ne suis pas sûr des autres bases de données, mais pour SQL Server, je recommande le plan d'exécution.Il montre très clairement (bien qu'avec beaucoup de défilement vertical et horizontal, à moins que vous n'ayez un moniteur de 400 pouces !) Quelles étapes de votre requête prennent du temps.

Si vous avez une étape qui prend un taux fou de 80 %, alors peut-être qu'un index pourrait être ajouté, puis après avoir peaufiné l'index, réexécutez le plan d'exécution pour trouver votre prochaine étape la plus importante.

Après quelques ajustements, vous constaterez peut-être qu'il n'y a vraiment aucune étape qui se démarque des autres, c'est-à-direils représentent tous 1 à 2 % chacun.Si tel est le cas, vous devrez peut-être alors voir s'il existe un moyen de réduire la quantité de données incluses dans votre requête. Ces quatre millions de commandes client clôturées doivent-elles être incluses dans la requête « Commandes client actives » ?Non, alors excluez tous ceux avec STATUS='C' ...ou quelque chose comme ça.

Une autre amélioration que vous constaterez dans le plan d'exécution concerne les recherches de signets. En gros, il trouve une correspondance dans l'index, mais SQL Server doit ensuite parcourir rapidement la table pour trouver l'enregistrement souhaité.Cette opération peut parfois prendre plus de temps que la simple analyse de la table, si tel est le cas, avez-vous vraiment besoin de cet index ?

Avec les index, et en particulier avec SQL Server 2005, vous devriez vous tourner vers la clause INCLUDE, cela vous permet essentiellement d'avoir une colonne dans un index sans vraiment être dans l'index, donc si toutes les données dont vous avez besoin pour votre requête se trouvent dans votre index ou est une colonne incluse, alors SQL Server n'a même pas besoin de regarder le tableau, ce qui représente une grande amélioration des performances.

Vous pouvez prendre en compte plusieurs éléments pour optimiser les performances de vos requêtes.

  1. Assurez-vous de disposer du minimum de données.Assurez-vous de sélectionner uniquement les colonnes dont vous avez besoin.Réduisez la taille des champs au minimum.

  2. Pensez à dénormaliser votre base de données pour réduire les jointures

  3. Évitez les boucles (c.-à-d.récupérer les curseurs), s'en tenir aux opérations définies.

  4. Implémentez la requête en tant que procédure stockée car elle est précompilée et s'exécutera plus rapidement.

  5. Assurez-vous que les index corrects sont configurés.Si votre base de données est principalement utilisée pour la recherche, envisagez davantage d'index.

  6. Utilisez le plan d'exécution pour voir comment le traitement est effectué.Ce que vous voulez éviter, c'est une analyse de table car cela coûte cher.

  7. Assurez-vous que les statistiques automatiques sont activées.SQL en a besoin pour décider de l'exécution optimale.Voir l'excellent article de Mike Gunderloy pour plus d'informations. Bases des statistiques dans SQL Server 2005

  8. Assurez-vous que vos index ne sont pas fragmentés Réduire la fragmentation de l'index SQL Server

  9. Assurez-vous que vos tables ne sont pas fragmentées. Comment détecter la fragmentation de table dans SQL Server 2000 et 2005

Le plan d'exécution est un bon début et vous aidera à déterminer quelle partie de votre requête vous devez aborder.

Une fois que vous avez compris où, il est temps d’aborder le comment et le pourquoi.Jetez un œil au type de requêtes que vous essayez d’exécuter.Évitez à tout prix les boucles car elles sont lentes.Évitez à tout prix les curseurs car ils sont lents.Tenez-vous-en aux requêtes définies lorsque cela est possible.

Il existe des moyens de donner des indications SQL sur le type de jointures à utiliser si vous utilisez des jointures.Soyez prudent ici cependant, même si un indice peut accélérer votre requête une fois, il peut la ralentir 10 fois la prochaine fois en fonction des données et des paramètres.

Enfin, assurez-vous que votre base de données est bien indexée.Un bon point de départ est tout champ contenu dans une clause Where qui devrait probablement comporter un index.

Regardez les index des tables qui effectuent la requête.Des index peuvent être nécessaires sur des champs particuliers qui participent à la clause Where.Regardez également les champs utilisés dans les jointures de la requête (si des jointures existent).Si des index existent déjà, regardez le type d'index.

À défaut (car il y a des inconvénients à utiliser des astuces de verrouillage), examinez les astuces de verrouillage et nommez explicitement l'index à utiliser dans la jointure.L'utilisation de NOLOCKS est plus évidente si vous rencontrez de nombreuses transactions bloquées.

Faites ce que Roman et Andy S ont mentionné en premier.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top