web-dev-qa-db-fra.com

Pourquoi ma requête s'exécute-t-elle rapidement dans l'environnement A, mais lente dans l'environnement B?

J'ai un morceau de SQL qui semble fonctionner très rapidement dans l'environnement A, mais la même requête exacte s'exécute très lentement dans l'environnement B!

Les environnements sont censés être les mêmes, alors que dois-je faire et/ou où dois-je chercher pour voir pourquoi la requête ne fonctionne pas de la même manière?

7
LowlyDBA

Il existe de nombreux facteurs internes et externes à SQL Server qui peuvent entraîner l'exécution différente d'une même requête dans différents environnements, même lorsqu'ils sont configurés exactement de la même manière, chacun pouvant entraîner des plans de requête et des performances très différents.

Serveur

  • Le matériel est-il le même dans tous les environnements (disques, mémoire, CPU, etc.)?
    • Si des machines virtuelles sont utilisées, est-ce que voisins bruyants peut affecter les performances globales VM?
    • Si dans le cloud, la mise à l'échelle automatique et les autres configurations ont-elles la parité?
  • Les environnements sont-ils mélangés entre physique/virtuel/cloud?
  • Les versions du système d'exploitation correspondent-elles?
  • Les environnements sont-ils dans différents centres de données?

Instance

  • Les versions de SQL Server sont-elles les mêmes?
    • Un CU ou SP peut faire toute la différence même si les versions principales sont les mêmes.
  • La charge de travail active pendant l'exécution des requêtes est-elle comparable?
    • Le même volume de requêtes est-il présent dans tous les environnements?
    • La nature de la charge de travail est-elle la même dans tous les environnements?
  • Tous les environnements participent-ils à la même configuration HA/DR?
    • Souvent, les environnements inférieurs n'auront pas de groupes de disponibilité, d'envoi de journaux ou de configuration de réplication alors que la production/DR peut utiliser ces technologies.
  • Les mêmes travaux de maintenance sont-ils exécutés selon les mêmes horaires dans tous les environnements?
  • Les indicateurs de trace sont-ils équivalents dans tous les environnements?
  • Les mêmes travaux de sauvegarde s'exécutent-ils dans tous les environnements?
    • L'impact des sauvegardes doit être minime, mais souvent elles ne sont pas exécutées du tout sur les environnements inférieurs.
  • Les configurations sys sont-elles les mêmes?

Base de données

  • Les schémas/index/statistiques/objets sont-ils tous égaux dans tous les environnements?
  • Les mêmes données exact existent-elles dans tous les environnements?
    • Quantité de données
    • Distribution des données
    • Taille des données (pensez à des données factices dans des types de données de longueur variable qui peuvent ne pas refléter la taille des valeurs réelles dans d'autres environnements)
  • Les configurations au niveau de la base de données sont-elles les mêmes?
  • Les niveaux de compatibilité sont-ils les mêmes?

Avec tout cela à l'esprit, il n'est pas surprenant que dans de nombreux cas, il soit simplement pas possible de copier parfaitement tous les aspects d'une base de données dans différents environnements. Bien que les tests puissent donner un bon degré de certitude quant au fonctionnement des requêtes dans chaque environnement, il n'est pas surprenant qu'il existe des écarts entre les environnements. Lors du développement d'une nouvelle requête, un réglage supplémentaire est souvent nécessaire à mesure qu'il se déplace vers la production.

Habituellement, le réglage d'une requête qui est plus lente dans un environnement ne doit pas provoquer de régressions dans les plans d'exécution générés, c'est donc l'occasion d'ajuster les index, les statistiques ou la requête elle-même pour une amélioration globale.

Remarque finale: les environnements inférieurs sont sous-dimensionnés et ne devraient souvent pas fournir les mêmes performances qu'un environnement de production ou de pré-production.

Davantage de ressources:

13
LowlyDBA

Les autres réponses sont bonnes, mais j'ajouterais que vous devez tenir compte de la quantité de données dans l'environnement B et de tout conflit avec d'autres requêtes.

Certaines requêtes SQL ne présentent aucun problème de performances isolément (par exemple, 1000 lignes dans la table, aucune autre requête en cours d'exécution), mais peuvent être horror-show avec 10 000 000 de lignes dans la table (par exemple, des problèmes de reniflage de paramètres), et/ou d'autres requêtes pouvant écrire, mettre à jour ou verrouiller les tables concernées.

Je suis d'accord avec les autres réponses sur la vérification de la correspondance du matériel/des environnements/des configurations en premier, mais si rien d'évident n'apparaît, commencez à regarder les plans d'exécution des requêtes, exécutez SQL Profiler, etc.

9
Phil S

En bref, vous devez isoler si la base de données elle-même est lente par rapport à l'autre, ou si son environnement est plus lent. Éliminez d'abord les choses les plus faciles.

Cela m'est arrivé à plusieurs reprises. Chaque fois, cela s'est avéré être un environnement: quelqu'un d'autre martelait et affamait la base de données d'IOPS sur un serveur.

Exécutez un top (1) sur le serveur plus lent et voyez si le CPU connaît des quantités élevées d'états d'attente, ou un vol d'unité centrale de traitement si vous êtes dans un environnement virtuel.

Cela aidera également à signaler les index manquants qui entraînent des plans d'exécution pour effectuer des analyses de table complètes au lieu d'analyses d'index (mais c'est facile à repérer avec la journalisation lente des requêtes). Cela apparaîtra également dans ps en tant que procs dans un état D.

Une fois que vous avez exclu cela, il est temps de creuser plus profondément dans le matériel: le travail est-il réparti sur tous les processeurs, un port réseau s'est-il renégocié à 100 Mo. Exécutez vmstat et/ou iostat sur les deux machines et comparez les différences.

Si les jeux de données sont identiques, la même requête génère-t-elle le même plan d'exécution sur les deux? Les tableaux contiennent-ils le même nombre de lignes? Les définitions d'index sont-elles identiques? Les tableaux ont-ils des niveaux de fragmentation similaires? Nombre similaire de connexions actives?

3
dland