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?
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
Instance
Base de données
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:
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.
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?