Solucionando problemas de desempenho ruim de consulta: estimativa de cardinalidade
O otimizador de consulta no SQL Server é baseado no custo. Isso significa que ele seleciona planos de consulta com o custo de processamento estimado mais baixo para ser executado. O otimizador de consulta determina o custo de execução de um plano de consulta com base em dois fatores principais:
O número total de linhas processadas em cada nível de um plano de consulta, chamado cardinalidade do plano.
O modelo de custo do algoritmo ditado pelos operadores usados na consulta.
O primeiro fator, cardinalidade, é usado como um parâmetro de entrada do segundo fator, o modelo de custo. Portanto, a cardinalidade aprimorada gera custos melhor estimados e, conseqüentemente, planos de execução mais rápidos.
O SQL Server calcula cardinalidades principalmente a partir de histogramas gerados quando índices ou estatísticas são criados manual ou automaticamente. Às vezes, o SQL Server também usa informações de restrição e novas consultas lógicas para determinar a cardinalidade.
Nos casos a seguir, o SQL Server não consegue calcular cardinalidades com precisão. Isso gera cálculos de custo inexatos que podem causar planos de consulta menos favoráveis. Evitando-se tais construções em consultas é possível melhorar o desempenho da consulta. Às vezes, formulações de consulta alternativas ou outras medidas são possíveis e indicadas.
Consultas com predicados que usam operadores de comparação entre colunas diferentes da mesma tabela.
Consultas com predicados que usam operadores e qualquer um dos itens seguintes são true:
Não há nenhuma estatística referente às colunas envolvidas em nenhum dos lados dos operadores.
A distribuição de valores nas estatísticas não é uniforme, mas a consulta busca um conjunto de valores altamente seletivo. Essa situação pode ser especialmente verdadeira se o operador não for o operador de igualdade (=).
O predicado usa o operador de comparação diferente de (! =) ou o operador lógico NOT.
Consultas que usem qualquer uma das funções internas do SQL Server ou uma função com valor escalar, definida pelo usuário, cujo argumento não é um valor constante.
Consultas que envolvem colunas de associação por aritmética ou operadores de concatenação de cadeias de caracteres.
Consultas que comparam variáveis cujos valores não são conhecidos quando a consulta é compilada e otimizada.
As medidas a seguir podem ser usadas para tentar melhorar o desempenho nesses tipos de consultas:
Criar índices ou estatísticas nas colunas envolvidas na consulta. Para obter mais informações, consulte Criando índices e Usando estatísticas para melhorar o desempenho de consultas.
Considere o uso de colunas computadas e reescrever a consulta se ela usar comparação ou operadores aritméticos para comparar ou combinar duas ou mais colunas. Por exemplo, a consulta a seguir compara os valores em duas colunas:
SELECT * FROM MyTable WHERE MyTable.Col1 > MyTable.Col2
O desempenho pode ser melhorado se você adicionar uma coluna computada Col3 a MyTable que calcula a diferença entre Col1 e Col2 (Col1 menos Col2). Em seguida, reescreva a consulta:
SELECT * FROM MyTable WHERE Col3 > 0
O desempenho deve ser ainda melhorar se você construir um índice em MyTable.Col3.