Eu tenho um procedimento armazenado que se parece com isso:
SELECT columnlist
INTO #temptable
FROM Table
JOIN lotsofothertables
WHERE severalconditions
UPDATE anothertable
SET column = #temptable.column
FROM anothertable
JOIN #temptable
ON anothertable.PKColumn = #temptable.PKColumn
A consulta inicial frequentemente produzirá apenas algumas colunas (<100) para que a atualização seja rápida. Mas, ocasionalmente (e essas são as execuções com as quais estamos tendo problemas), ele produz 1.000 ou mesmo 10.000. Seria razoável acrescentar algo assim entre eles?
IF @@RowCount > 100
CREATE INDEX ix_temp ON #temptable(PKColumn)
Ou é melhor apenas criar o índice na tabela, independentemente, já que com tão poucas linhas, a quantidade de tempo gasto criando o índice será bem pequena?
Isso é um tanto subjetivo, mas não sou fã de
SELECT ... INTO
qualquer maneira e normalmente o substituo por um explícitoCREATE TABLE
eINSERT ... SELECT
como os tipos de dados, nomes de coluna e nulidade podem ser vistos muito mais explicitamente (e ambos podem ser minimamente registrados ).Nesse caso, se você criar a tabela temporária com uma restrição de chave primária sem nome na coluna na frente
em vez de criar a tabela e adicionar um índice posteriormente, você poderá se beneficiar (pelo menos potencialmente, pois isso tem alguns problemas ) do cache de objetos da tabela temporária.
Eu não me incomodaria em torná-lo condicional à contagem de linhas, a menos que você tenha provado que a presença do índice com poucas linhas de alguma forma causa uma deterioração significativa no desempenho (improvável).