Dentro de um procedimento armazenado executado com frequência (às vezes até 10-15 vezes por segundo), há duas instruções específicas que aparecem nas 10 consultas mais pesadas por impacto cumulativo na CPU
Estas são instruções DDL para criar tabelas #Temp:
1.
SELECT cast(0 as int) as rowId
, Column1 as tColumn1
, Column2 as tColumn2
, ...
, Column14 as tColumn14
, cast(0 as datetime) as tUTC
, -1 as tRefId
INTO #TempTable1
FROM Table1 WITH(NOLOCK)
WHERE 0=1
SELECT tColumn1, ..., tColumn14, tUtc, tRefId
INTO #TempTable2
FROM #TempTable1
WHERE 0=1
Qualquer um dos DDL acima, leva em média 10-15 ms de tempo de CPU, simplesmente para criar uma tabela #temp
Alterar a lógica do procedimento armazenado, para que NÃO crie tabelas temporárias, não é uma opção
Pergunta : Como o tempo de criação da tabela temporária pode ser acelerado, em termos de tempo de CPU?
pode ser uma maneira conveniente de criar uma tabela vazia, mas eu esperaria que uma
CREATE TABLE
instrução DDL simples fosse mais eficiente.Não há necessidade de
CREATE TABLE
passar pelo processo de compilação do plano (para compilar um plano de execução que é simplificado para uma seleção de uma varredura constante) e depois executá-lo.Potencialmente mais importante (para esta discussão) a
CREATE TABLE
versão dentro de um procedimento armazenado também pode permitir um melhor uso do Cache de Objeto Temporário do SQL Server para evitar muito do trabalho necessário para a criação.Para que isso aconteça, você precisa evitar certas construções que impedem o armazenamento em cache. Veja a postagem vinculada para mais detalhes. Uma delas é 'Executar "DDL" após a criação do objeto'.
CREATE TABLE
permite que índices e restrições sejam definidos declarativamente no momento da criação.SELECT ... INTO
exigiria que eles fossem adicionados após a criação, portanto, é mais provável que essa rota termine em um estado em que a tabela não atenda aos requisitos de armazenamento em cache.A menos que esteja lidando com pequenos conjuntos de dados, sempre achei mais rápido criar a tabela temporária antes de inserir dados usando a sintaxe CREATE TABLE #TableName. Se você estiver indexando a tabela, sempre tive o melhor desempenho adicionando-a após a inserção dos dados.