Part-2 Variáveis table e JOIN's (DECLARE @table_variable_name TABLE)
Não use variáveis de tabela em conjunto com JOIN. Use tabelas temporárias, CTEs (Common Table Expressions) em JOIN.
Embora as variáveis table sejam muito rápidas e eficientes em muitas situações, o mecanismo do SQL Server a vê como uma única linha. Devido a isso, eles apresentam um desempenho horrível quando usados em JOIN's. Tabelas temporárias apresentam melhor desempenho com JOIN's em comparação com as variáveis da tabela.
Dica complementar: Criação de tabelas dentro de stored procedures? Cuidado!
Quando uma tabela é criada e utilizada dentro de uma mesma stored procedure, o otimizador não tem conhecimento das suas estatísticas, e assume que esta tabela tem 100 linhas e 10 páginas. Se a tabela criada é muito grande, esta suposição pode levar o otimizador a calcular um plano de acesso não otimizado / Errado. Para evitar este problema, crie a tabela em uma rotina anterior e utilize-a em outra.
Variáveis Locais ou Parâmetros na cláusula WHERE ?
O otimizador não tem informações sobre o valor de uma variável, mas, em tempo de compilação, sabe o valor de um parâmetro. Isso posto, a utilização de parâmetros em cláusula where, leva o otimizador a produzir um plano de acesso mais eficiente.
mais recente, detalhamos esse hint no topico especifico: Dicas que todo DEV deveria conhecer
Parte 4 - Ad Hoc Queries (Forced Parameterization)
Exemplo sugestivo, observe que na primeira procedure
a Variavel @x recebe = b1 e logo em sequencia a variavel é passada como filtro WHERE b1 = @x
(O otimizador não tem informações sobre o valor de uma variável)
Na segunda procedure, em duas estapas: @x recebe = b1
Que é passado como parâmetro pra uma segunda procedure Exec s_p2 (@x) --solução
(Que força o otimizador a produzir um plano de acesso mais eficiente)
* Imagine no exemplo, uma tabela (t2) já criada anteriormente no escopo da procedure.
Nenhum comentário:
Postar um comentário