Existe uma maneira de determinar se um plano foi gerado apenas para uma consulta específica ou foi encontrado no cache do plano?
10
Existe uma maneira de determinar se um plano foi gerado apenas para uma consulta específica ou foi encontrado no cache do plano?
O SQL Server 2012 possui um indicador no próprio plano RetrievedFromCache
, que pode ser "verdadeiro" ou "falso".
Parece ser a propriedade que você está perguntando.
Esta é uma amostra (a última linha mostra a propriedade):
<StmtSimple StatementCompId="1" StatementEstRows="1" StatementId="1"
StatementOptmLevel="FULL" StatementOptmEarlyAbortReason="GoodEnoughPlanFound"
StatementSubTreeCost="0.0508992" StatementText="SELECT COUNT(*)

FROM sys.tables" StatementType="SELECT"
QueryHash="0x9A4B63A948B30EA0" QueryPlanHash="0xF357CAE882D5B15D"
RetrievedFromCache="true">
Infelizmente, não vejo nada semelhante em um plano gerado pelo SQL Server 2008 R2.
No SQL Server 2008 R2, você pode usar a sys.dm_exec_query_stats
DMV do sistema para inspecionar a creation_time
coluna em busca de planos com o mesmo query_hash
valor. O hash da consulta pode ser obtido no cabeçalho do XML do plano (veja o exemplo acima). Esta consulta retornará linhas relacionadas ao plano mencionado acima:
SELECT *
FROM sys.dm_exec_query_stats qs
WHERE qs.query_hash = 0x9A4B63A948B30EA0;