Partilhar via


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.