Bonjour,
Je m'arrache les cheveux depuis quelques jours sur une requête dont les performances sont passées de bonnes (temps d'exécution de 10s) à très mauvaises (19mn) du jour au lendemain. Cette requête est contenue dans une vue et exécutée deux fois par jour.
Pour le contexte :
1 serveur SQL Server 2012, contenant deux bases Base1 et Base2.
La requête concernée est exécutée depuis Base2, sur 24 tables et vues contenues uniquement dans Base1. Nous n'avons un accès qu'en lecture sur Base1, d'où la création de cette vue sur Base2 plutôt que Base1.
Lorsque la requête est lancée depuis Base1 (Requête1), le temps d'exécution est tout à fait correct (autour de 10s). Lorsque la même requête est lancée depuis Base2 (Requête2) le temps d'exécution passe à 19mn.
Les plans d'exécution sont différents, lorsque j'applique le plan de la requête1 à la requête2, les temps de réponse sont tout à fait satisfaisant, mais je ne peux pas me contenter de cette solution car nous faisons fréquemment évoluer cette vue, donc le plan serait à revoir à chaque fois).
Pour les différences que je constate sur les plans, et qui je suppose pourraient expliquer les écarts constatés :
- le plan d'exécution de la Requête2 applique des prédicats sur des analyses d'index pour lesquelles il n'y a pas de prédicat sur le plan de la requête1,
- Sur ces mêmes analyses d'index, le nombre d'exécutions et le nombre de lignes lues explose littéralement : respectivement 1 contre 3052 et 163K contre 497M pour mon exemple le plus flagrant, entre Requête1 et Requête2. Les nombres estimés sont pourtant peu ou prou identiques,
- L'analyse du plan m'indique une estimation de cardinalité à 70 sur Base1, et 120 sur Base2.
Pourquoi les plans d'exécution sont-ils différents, alors qu'il s'agit de la même requête passée sur les mêmes tables et vues (donc des statistiques, clés, index,... identiques) ?
Merci d'avance de votre aide,
Etienne
Partager