Même requête, différents plans d'exécution

J'essaie de find une solution à un problème qui me rend fou …

J'ai une requête qui s'exécute très rapidement dans un QA Server mais elle est très lente en production. Je me suis rendu count qu'ils avaient des plans d'exécution différents … donc j'ai essayé de recomstackr, nettoyer le cache pour les plans d'exécution, mettre à jour les statistics, vérifier le type de collation … mais je n'arrive toujours pas à find ce qui se passe …

Les bases de données dans lesquelles la requête est exécutée sont exactement les mêmes et les servers SQL ont également la même configuration.

Toute nouvelle idée serait très appréciée.

Merci.


Je viens de réaliser que le server QA exécute SP3 et en production est SP2. Cela pourrait-il avoir un impact sur ce problème?

Est-il possible que le server de production ait une taille de database plus grande? Le plan peut être différent car il est basé sur des statistics sur datatables qu'il contient.

Je pense que cela pourrait être dû au volume de données présentes. Il nous est arrivé une fois où la requête volait littéralement dans le server de QA mais était incroyablement lente dans la production. Après nous être cassé la tête pendant un moment, nous avons découvert que le server d'assurance qualité avait 15 000 lignes alors que la production en comptait 1,5 million.

HTH

Si le plan d'exécution était le même et qu'un plan était lent, il s'agirait de la charge de la database, du matériel, du locking / blocage, etc.

Cependant, si les plans d'exécution sont différents, quelque chose est différent entre les deux bases de données. Les statistics sont-elles à jour dans les deux, ont exactement les mêmes schémas, les mêmes index, le même nombre de lignes, la même dissortingbution de PK et d'index, etc. D'où proviennent datatables QA, ou est-ce une restauration de production?

Désactiver l'exécution de requêtes parallèles en production 🙂

Je suis tombé sur ceci récemment et voici ce que j'ai trouvé.

J'avais deux bases de données qui étaient essentiellement des copys les unes des autres. Sur une version, une TVF prenait une seconde à courir, tandis que sur l'autre version, il fallait 15 minutes pour fonctionner.

Les plans d'exécution du code SQL sous-jacent étaient très différents. J'ai été capable de le réparer en reconstruisant des index sur lesquels le TVF comptait. Les plans d'exécution ne sont pas les mêmes, mais cela a beaucoup changé. Et le time d'exécution est redescendu à environ une seconde.

Maintenant, les deux versions avaient des index très fragmentés. Mon hypothèse est que les statistics historiques ou les informations du plan d'exécution ont permis à la version rapide de continuer à find un plan d'exécution optimal.

Donc, pour résumer: assurez-vous de regarder la fragmentation de vos index même s'ils ont la même structure ou des taux de fragmentation similaires.