temos um banco de dados no SQL Server 2019 com compatibilidade definida como 110 (SQL Server 2012). Temos um procedimento armazenado que está sendo recompilado com frequência, e notei que estamos usando muitas tabelas temporárias. Criamos uma tabela temporária, inserimos dados e, em seguida, adicionamos um índice nela para consultas posteriores. Suspeito que isso pode estar causando as recompilações. As tabelas temporárias acionam recompilações e, em caso afirmativo, em que condições? Obrigado!
relate perguntas
-
SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado
-
Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?
-
Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?
-
Quais são as principais causas de deadlocks e podem ser evitadas?
-
Como determinar se um Índice é necessário ou necessário
O documento Recompilar um Procedimento Armazenado diz:
Além disso, o white paper Plan Caching and Recompilation in SQL Server 2012 afirma que:
Portanto, o culpado não é a tabela temporária em si, mas a alteração feita em seu esquema.
Cenário 1 (sem cache de tabela #temp)
O rastreamento dos eventos de compilação, conforme descrito no white paper Planejar cache e recompilação no SQL Server 2012, mostra exatamente o mesmo em cada execução.
No caso acima, a
#temp
tabela não existe no início da execução em cada execução. Então, todas as instruções que fazem referência a ela estarão sujeitas à compilação adiada e serão compiladas imediatamente antes de serem executadas pela primeira vez. Se você tiver apenas um fluxo linear através das instruções, então este é o único motivo de recompilação que você verá devido ao#temp
uso da tabela em si. Adicionei um GOTO acima para tornar as coisas um pouco mais interessantes e para mostrar a segunda recompilação da primeira instrução SELECT após a criação do índice.Cenário 2 (com cache de tabela #temp)
A mudança significativa do primeiro proc é que não há nenhuma
CREATE INDEX
instrução separada. Isso significa que a#temp
tabela é elegível para o Temporary Table Caching (já que esse era o único problema de bloqueio para isso neste caso) se o SQL Server decidir fazê-lo (na minha máquina de desenvolvimento, isso levou algumas tentativas para ver, pois eu estava um pouco deixando meu SQL Server local sem memória). Quando nenhuma tabela temporária em cache é reutilizada, ela mostra o padrão usual de compilações adiadas. A área destacada em rosa no rastreamento mostra uma execução onde reutilizou uma tabela temporária em cache e não houve eventos de recompilação. Isso não significa que sempre haverá zero eventos de recompilação associados à#temp
tabela, no entanto. Você ainda pode acabar vendo outros motivos usuais de recompilação, como "Estatísticas alteradas" - embora como isso funciona no caso de tabelas temporárias em cache possa ser problemático .