Comment la même requête dans deux instances presque identiques peut-elle générer deux plans d'exécution différents?

dba.stackexchange https://dba.stackexchange.com/questions/30009

Question

Le serveur A et le serveur B ont des configurations matérielles et d'instance identiques (A est la production, B est QA). Les DB de B ont été restaurés à partir des sauvegardes de A il y a une semaine. J'ai reçu cette requête par l'équipe de développement.

SELECT 
        c.Start
        ,c.[End]
        ,c.Word
        ,doc.UniqueDocumentNumber
        ,doc.EID
        ,c.CUI
        ,c.Concept
        ,a.OID
        ,doc.DocumentTypeName
        ,doc.ActivityDtTm
        ,CAST(doc.DocumentTypeId AS INT) AS MedCode
        ,CASE WHEN c.[Count] = 0 THEN  CAST(0.00 AS REAL)
           ELSE CAST(LOG(c.TotalCount / c.[Count]) AS REAL) END AS 'idf'
        ,c.[Count]
        ,c.TotalCount
FROM ECHO..AEID201 a
INNER JOIN ALPHA..XADocuments doc (NOLOCK) ON a.EID = doc.EID
CROSS APPLY (SELECT t.start,t.[end],t.word,t.cui,t.eid,
   t.UniqueDocumentNumber,cu.[Count],cc.TotalCount,core.Concept 
FROM HOTEL.dbo.Htf_Index AS t
INNER JOIN HOTEL..Doc_CUI_Counter AS cu ON cu.CUI=t.CUI AND cu.DocumentTypeID=t.DocumentTypeID
INNER JOIN HOTEL..Doc_Counter AS cc ON cc.DocumentTypeID=t.DocumentTypeID
INNER JOIN HOTEL..CUI_CORE AS core ON core.CUI=cu.CUI
WHERE t.eid = doc.eid AND doc.UniqueDocumentNumber=t.UniqueDocumentNumber
) AS c
WHERE a.OID='00005159-9567-4187-a278-5b8e1e2ed20c' 
AND ISNUMERIC(doc.DocumentTypeId) = 1

Sur le serveur B, l'examen du plan d'exécution indique que les critères de tableau [A] en bas font partie d'une opération de recherche d'index au début du plan d'exécution, ce qui fait que le sous-requête [c] se termine rapidement.

Sur le serveur A, l'examen du même plan d'exécution indique que la sous-requête [C] s'exécute d'abord avec des analyses d'index complètes en raison de critères extérieurs qui ne sont pas appliqués.

Les indices utilisés dans les deux plans d'exécution sont identiques. Les comptes de lignes de table sont légèrement plus importants sur le serveur A, car la restauration en raison des opérations normales, mais la fragmentation d'index est presque identique. Un index participant sur la table [t] dans la sous-requête sur le serveur B a le double du nombre de pages comme sur le serveur A mais le nombre de lignes identiques. Les statistiques sont mises à jour tous les soirs en même temps sur les deux serveurs.

J'ai tenté des reconstructions d'index sur la table [t] et la mise à jour manuelle des statistiques pour tenter d'obtenir les deux plans d'exécution à égalité. Quels autres facteurs peuvent provoquer ce changement dans l'ordre d'exécution?

J'ai suggéré au développeur remplaçant la sous-requête par un UDF qui prend les champs Eid et UniqueCumentNumber de [Doc] comme arguments. Quelles autres options puis-je explorer avec le développeur pour augmenter la probabilité que les plans d'exécution sur l'AQ sont utilisés sur prod?

Pas de solution correcte

Licencié sous: CC-BY-SA avec attribution
Non affilié à dba.stackexchange
scroll top