O Servidor A e o Servidor B têm hardware idêntico e configurações de instância (A é Produção, B é QA). Os bancos de dados de B foram restaurados dos backups de A de uma semana atrás. Essa consulta foi fornecida pela equipe de desenvolvimento.
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
No Servidor B, a revisão do plano de execução indica que os critérios para a tabela [a] na parte inferior fazem parte de uma operação de busca de índice no início do plano de execução, o que faz com que o conjunto de resultados da subconsulta [c] seja executado rapidamente.
No servidor A, a revisão do mesmo plano de execução indica que a subconsulta [c] está sendo executada primeiro com varreduras de índice completas devido à não aplicação de critérios externos.
Os índices utilizados em ambos os planos de execução são idênticos. As contagens de linhas da tabela são um pouco maiores no Servidor A desde a restauração devido às operações normais, mas a fragmentação do índice é quase idêntica. Um índice participante na tabela [t] na subconsulta no Servidor B tem o dobro do número de páginas do Servidor A, mas contagem de linhas idêntica. As estatísticas são atualizadas todas as noites ao mesmo tempo em ambos os servidores.
Eu tentei reconstruir o índice na tabela [t] e atualizar manualmente as estatísticas para tentar obter a correspondência dos dois planos de execução. Que outros fatores podem estar causando essa mudança na ordem de execução?
Sugeri ao desenvolvedor substituir a subconsulta por uma UDF que usa os campos EID e UniqueDocumentNumber de [doc] como argumentos. Que outras opções posso explorar com o desenvolvedor para aumentar a probabilidade dos planos de execução no QA serem utilizados no Prod?
Os planos de execução (reais, não estimados) precisam ser adicionados ao Q para uma resposta definitiva, mas...
Porque, como você admite, eles não são idênticos. A explicação mais provável para os diferentes planos de execução é uma variação nas estatísticas.
As contagens de linhas são diferentes e a atualização de estatísticas provavelmente foi uma amostra padrão, em vez de
FULLSCAN
. Eu testemunhei alguns histogramas de estatísticas comicamente infelizes como resultado da amostragem, cada um dos quais foi corrigido por umaFULLSCAN
atualização.