In che modo la stessa query in due istanze quasi identiche può generare due diversi piani di esecuzione?
-
31-10-2019 - |
Domanda
Il server A e il server B hanno identiche configurazioni hardware e istanza (A è la produzione, B è QA). I DB di B sono stati ripristinati dai backup di A di una settimana fa. Mi è stata fornita questa domanda dal team di sviluppo.
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
Sul server B, la revisione del piano di esecuzione indica che i criteri per la tabella [A] in basso fanno parte di un'operazione di ricerca dell'indice all'inizio del piano di esecuzione, il che rende l'esecuzione rapida della sottocquery [C].
Sul server A, la revisione dello stesso piano di esecuzione indica che la sottoquery [C] si sta eseguendo per prima con scansioni di indice complete a causa di criteri esterni non applicati.
Gli indici utilizzati in entrambi i piani di esecuzione sono identici. I conteggi delle righe della tabella sono leggermente più grandi sul server A poiché il ripristino a causa delle normali operazioni, ma la frammentazione dell'indice è quasi identica. Un indice partecipante sulla tabella [T] nella sottoquery sul server B ha il doppio del numero di pagine come sul server A ma identico conteggio delle righe. Le statistiche vengono aggiornate ogni notte contemporaneamente su entrambi i server.
Ho tentato le ricostruzioni dell'indice sulla tabella [t] e l'aggiornamento manuale delle statistiche per tentare di ottenere entrambi i piani di esecuzione da abbinare. Quali altri fattori potrebbero causare questo cambiamento nell'ordine di esecuzione?
Ho suggerito allo sviluppatore che sostituisce la sottoquery con un UDF che prende i campi EID e UniquedocumentNumber da [DOC] come argomenti. Quali altre opzioni posso esplorare con lo sviluppatore per aumentare la probabilità che i piani di esecuzione sul QA vengano utilizzati su Prod?
Nessuna soluzione corretta