Pergunta

Se você estiver criando uma tabela temporária em um procedimento armazenado e quiser adicionar um ou dois índices a ela, para melhorar o desempenho de quaisquer instruções adicionais feitas contra ela, qual é a melhor abordagem?Sybase diz esse:

"a tabela deve conter dados quando o índice for criado.Se você criar a tabela temporária e criar o índice em uma tabela vazia, o Adaptive Server não criará estatísticas de coluna, como histogramas e densidades.Se você inserir linhas de dados após criar o índice, o otimizador terá estatísticas incompletas."

mas recentemente um colega mencionou que se eu criar a tabela temporária e os índices em um procedimento armazenado diferente daquele que realmente usa a tabela temporária, então o otimizador do Adaptive Server vai poder fazer uso deles.

No geral, não sou um grande fã de procedimentos de wrapper que agregam pouco valor, então não tive tempo de testar isso, mas pensei em colocar a questão lá fora, para ver se alguém tinha alguma outra abordagens ou conselhos?

Foi útil?

Solução

Algumas reflexões:

  • Se a sua tabela temporária for tão grande que você precise indexá-la, existe uma maneira melhor de resolver o problema?
  • Você pode forçá-lo a usar o índice (se tiver certeza de que o índice é a maneira correta de acessar a tabela) dando uma dica de otimizador, no formato:

    SELECT * 
    FROM   #table (index idIndex) 
    WHERE  id = @id
    

Se você estiver interessado em dicas de desempenho em geral, respondi algumas outras perguntas sobre isso aqui:

Outras dicas

Qual é o problema de adicionar os índices depois de colocar os dados na tabela temporária?

Uma coisa que você precisa estar atento é a visibilidade do índice para outras instâncias do procedimento que possam estar em execução ao mesmo tempo.

Gosto de adicionar um guia a esses tipos de tabelas temporárias (e aos índices), para garantir que nunca haja conflito.O outro benefício dessa abordagem é que você poderia simplesmente transformar a tabela temporária em uma tabela real.

Além disso, certifique-se de consultar os dados nessas tabelas temporárias mais de uma vez durante a execução do procedimento armazenado, caso contrário, o custo da criação do índice superará o benefício para a seleção.

No Sybase, se você criar uma tabela temporária e usá-la em um processo, o plano para a seleção será construído usando uma estimativa de 100 linhas na tabela.(O plano é construído quando o procedimento é iniciado antes de as tabelas serem preenchidas.) Isso pode fazer com que a tabela temporária seja verificada, pois ela tem apenas "100 linhas".Chamar outro proc faz com que o Sybase construa o plano para a seleção com o número real de linhas, o que permite ao otimizador escolher um índice melhor para usar.Tenho visto melhorias significativas usando essa abordagem, mas teste em seu banco de dados, pois às vezes não há diferença.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top