AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 343459
Accepted
Tuyen Nguyen
Tuyen Nguyen
Asked: 2024-11-07 04:35:23 +0800 CST2024-11-07 04:35:23 +0800 CST 2024-11-07 04:35:23 +0800 CST

Por que minha junção de Nested Loops está mostrando estimativas de linha imprecisas no SQL Server?

  • 772

Tenho o seguinte plano de execução:

plano de execução com estimativas de linhas imprecisas

Como você pode ver, as estimativas de linha para os operadores Clustered Index Scanand Index Seeksão precisas. No entanto, a junção Nested Loops tem uma discrepância significativa: a contagem real de linhas é 6.420, enquanto a contagem estimada de linhas é de apenas 72.

Minhas perguntas são:

  1. Como a contagem de linhas é estimada para uma junção de Nested Loops no SQL Server?
  2. Que fatores poderiam levar a uma estimativa de linha tão imprecisa neste caso?
  3. Há algo que eu possa fazer para melhorar ou corrigir a estimativa?

Obrigado por qualquer informação!

sql-server
  • 3 3 respostas
  • 560 Views

3 respostas

  • Voted
  1. Best Answer
    Paul White
    2024-11-07T11:00:38+08:002024-11-07T11:00:38+08:00
    1. Como a contagem de linhas é estimada para uma junção de Nested Loops no SQL Server?

    Não é diferente de um hash ou merge join. A exibição no SSMS geralmente parece diferente para loops aninhados porque o lado interno é por execução (ao olhar para um plano de pré-execução (estimado)).

    Fundamentalmente, você está perguntando como o SQL Server estima a seletividade de um join . A seletividade lógica permanece a mesma, qualquer que seja a implementação física (loops aninhados, apply, hash, merge) escolhida.

    A resposta ampla para essa pergunta é que o SQL Server pode usar uma de várias técnicas baseadas em informações de histograma ou frequência (valores distintos) para as colunas de predicado de junção.

    Não há uma fórmula única para estimativas baseadas em histograma ou frequência. Há diversas variações de modelagem que podem entrar em jogo dependendo dos predicados envolvidos, das informações disponíveis e da configuração do banco de dados.

    Os fatores de configuração mais importantes são qual modelo de estimativa de cardinalidade (CE) você está usando ('padrão' ou 'legado'), a configuração do nível de compatibilidade do banco de dados e se você tem hotfixes do otimizador de consulta habilitados. Essa não é uma lista completa.

    A questão é excepcionalmente leve em detalhes — nem mesmo fornece os predicados de junção — então não vou nem especular sobre uma causa específica aqui.

    1. Que fatores poderiam levar a uma estimativa de linha tão imprecisa neste caso?

    As estimativas são calculadas com base em informações estatísticas usando suposições e algoritmos de modelagem proprietários do SQL Server. Dadas estatísticas representativas, a causa mais frequente de estimativas imprecisas é uma desconexão entre os dados e as suposições de modelagem do SQL Server.

    1. Há algo que eu possa fazer para melhorar ou corrigir a estimativa?

    Primeiro, garanta que as estatísticas estejam atualizadas e de boa qualidade. Não confie somente em estatísticas amostradas padrão. Você pode precisar de uma taxa de amostragem mais alta ou até mesmo FULLSCANfornecer informações precisas o suficiente. Você também pode precisar criar estatísticas ou índices adicionais, dependendo da natureza exata da junção.

    Uma vez que isso esteja estabelecido, as principais coisas que você pode tentar são:

    1. Use um modelo de estimativa de cardinalidade diferente

      FORCE_DEFAULT_CARDINALITY_ESTIMATION
      FORCE_LEGACY_CARDINALITY_ESTIMATION
      
    2. Use variações de modelo documentadas

       ASSUME_JOIN_PREDICATE_DEPENDS_ON_FILTERS
       ASSUME_MIN_SELECTIVITY_FOR_FILTER_ESTIMATES
       ASSUME_FULL_INDEPENDENCE_FOR_FILTER_ESTIMATES
       ASSUME_PARTIAL_CORRELATION_FOR_FILTER_ESTIMATES
      
    3. Use um nível de compatibilidade do otimizador diferente se as estimativas costumavam ser melhores

       QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n
      

    Todas as opções acima são especificadas como uma USE HINTdica de consulta .

    Recursos

    • Perguntas e respostas existentes: Qual método/fórmula um operador de loops aninhados usa para estimativa de linha ?

    Se você estiver realmente interessado no processo de seletividade de junção subjacente ou em como vários predicados são combinados:

    • Otimizando seus planos de consulta com o estimador de cardinalidade do SQL Server 2014 - Microsoft
    • Junte-se a Estimation Internals por Dmitry Piliugin
    • Junte-se à estimativa de cardinalidade usando o alinhamento grosseiro do histograma por mim
    • Estimativa de cardinalidade para múltiplos predicados por mim
    • Estimativa de cardinalidade para predicados disjuntivos (OR) por mim
    • 10
  2. mustaccio
    2024-11-07T05:22:37+08:002024-11-07T05:22:37+08:00

    O SQL Server mantém estatísticas sobre cardinalidades de coluna e histogramas de distribuição de valor, então ele é capaz de estimar com algum nível de precisão quantas linhas podem corresponder a um predicado particular contra uma coluna, ou um conjunto de colunas, de uma única tabela. Ele não sabe, entretanto, quantos valores em uma coluna podem corresponder a um certo valor em uma coluna de uma tabela diferente , ou seja, ele não tem as estatísticas de correlação de coluna.

    Um possível mecanismo para gerar e usar tais estatísticas é permitir a coleta de estatísticas em visualizações simples (não materializadas e não indexadas). Você criaria então uma visualização unindo suas duas (ou mais) tabelas, e o mecanismo calcularia um histograma dos valores de coluna correlacionados.

    O SQL Server não parece ter a capacidade de manter estatísticas em exibições regulares, embora permita que você gere estatísticas em uma exibição indexada , o que se espera que possa produzir um efeito semelhante, então você pode tentar isso. Haverá, é claro, uma penalidade de desempenho por ter que manter o índice físico correspondente, além da utilização adicional de armazenamento.

    • 0
  3. David Browne - Microsoft
    2024-11-07T05:32:33+08:002024-11-07T05:32:33+08:00

    Para o operador Nested Loops, o "estimado" é por linha da tabela externa, ou seja, por "loop", e o "real" é o total em todos os loops.

    Veja, por exemplo: https://kendralittle.com/2016/09/06/estimated-vs-actual-number-of-rows-in-nested-loop-operators/

    • 0

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve