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 / 161194
Accepted
RayofCommand
RayofCommand
Asked: 2017-01-17 01:48:43 +0800 CST2017-01-17 01:48:43 +0800 CST 2017-01-17 01:48:43 +0800 CST

Quando eu tenho 6 núcleos e eles fazem uma varredura de tabela e mesclam depois, cada núcleo varre toda a tabela?

  • 772

Lembro que uma vez tive um índice ausente em uma tabela e uma consulta estava demorando muito. No plano de execução, vi que uma varredura de tabela e uma mesclagem foram feitas. As estatísticas de IO me mostraram que cada núcleo fez uma varredura de tabela, ou melhor, fiz 6 varreduras de tabela. Agora eu me pergunto se cada núcleo faz uma varredura completa ou cada núcleo faz aproximadamente 1/6 da varredura da tabela? Tenho certeza de que, se eu tivesse um índice adequado, obteria apenas uma busca ou seria dividido para cada núcleo.

Espero que entendam o que menciono aqui, infelizmente não posso fornecer nenhuma informação, pois a questão acabou de surgir e meu problema foi resolvido anos atrás.

performance sql-server-2012
  • 1 1 respostas
  • 220 Views

1 respostas

  • Voted
  1. Best Answer
    Joe Obbish
    2017-01-17T17:41:56+08:002017-01-17T17:41:56+08:00

    Para ser franco com você, não tenho certeza do que você quer dizer com "uma fusão foi feita". Você está falando sobre uma junção de mesclagem? Talvez você queira dizer um operador de paralelismo? No mínimo, posso responder à pergunta sobre varreduras de tabelas paralelas.

    As estatísticas de IO me mostraram que cada núcleo fez uma varredura de tabela, ou melhor, fiz 6 varreduras de tabela.

    Suponho que o que você quer dizer com isso é que você executou SET STATISTICS IO ONantes de executar sua consulta e parte da saída incluiu algo assim:

    Tabela 'sua_tabela'. Contagem de digitalização 6, ...

    O rótulo "contagem de varredura" é um pouco enganador. Você não deve concluir que, se STATISTICS IOrelatadas 6 verificações, todas as linhas da tabela foram verificadas 6 vezes. Considerando o seguinte exemplo simples de consulta em uma tabela heap chamada heap_table:

    SELECT TOP 1 *
    FROM heap_table
    OPTION (MAXDOP 1);
    

    Para essa consulta STATISTICS IO, deve relatar uma contagem de varredura de 1, certo? Mas o SQL Server claramente não precisava ler todas as linhas da tabela. Observar a definição do rótulo de contagem de varredura também é útil:

    Número de buscas/varreduras iniciadas após atingir o nível folha em qualquer direção para recuperar todos os valores para construir o conjunto de dados final para a saída.

    ...

    A contagem de varredura é N quando N é o número de diferentes buscas/varreduras iniciadas no lado esquerdo ou direito no nível folha após localizar um valor de chave usando a chave de índice.

    Portanto, se sua consulta fez uma varredura paralela, eu esperaria ver uma contagem de varredura de pelo menos 6, mas isso não implica necessariamente que todas as linhas da tabela foram lidas seis vezes. Como você pode saber como as linhas foram distribuídas entre os núcleos da CPU?

    A maneira mais fácil é apenas olhar para um plano de execução real. Se você observar os detalhes de uma verificação paralela, o SQL Server mostrará quantas linhas foram processadas por cada thread da CPU. Abaixo está uma imagem do que você pode ver emprestado do artigo de Paul White Planos de Execução Paralela – Ramos e Threads :

    exemplo de contagem de linhas de thread

    Como você disse, encontrou essa consulta anos atrás, então esse método não o ajudará. Em vez disso, precisamos examinar as técnicas disponíveis para o SQL Server para processamento de planos paralelos. Craig Freedman tem uma série de postagens de blog sobre o assunto. Do artigo Parallel Scan :

    Como funciona a varredura paralela?

    Os threads que compõem uma verificação paralela trabalham juntos para verificar todas as linhas em uma tabela. Não há nenhuma atribuição a priori ou linhas ou páginas para um segmento específico. Em vez disso, o mecanismo de armazenamento distribui dinamicamente páginas para threads. Um fornecedor de páginas paralelas coordena o acesso às páginas da tabela. O fornecedor de páginas paralelas garante que cada página seja atribuída a exatamente um thread e, portanto, seja processada exatamente uma vez.

    Bem, aí está. Como eu disse anteriormente, você pode testar isso facilmente executando uma consulta com uma verificação paralela e verificando os detalhes do operador de verificação paralela no plano de execução real.

    Para ver isso de outra maneira, tente pensar em um cenário em que seja benéfico para o SQL Server fazer uma verificação completa da tabela por núcleo.

    Suponha que você tenha uma UNION ALLconsulta que referencia sua tabela seis vezes. Em princípio, o SQL Server poderia fazer cada varredura de tabela com um núcleo de forma independente e combinar os resultados no final. No entanto, o SQL Server não fará isso porque não fará paralelismo de pipeline . Mesmo que pudesse, pessoalmente não consigo pensar em nenhuma vantagem em fazer isso aqui, além de evitar parte da sobrecarga associada ao paralelismo.

    Você poderia ler sobre o tipo de transmissão paralela de execução e se perguntar se nesse cenário o SQL Server poderia fazer seis verificações completas de uma tabela, uma com cada núcleo. Para o tipo de transmissão de troca, o SQL Server envia todas as linhas para todos os threads do consumidor. No entanto, isso pode ser feito com uma varredura serial na tabela seguida por um tipo de troca paralela Distribute Streams . Na verdade, isso é o que você vê no exemplo de hash join. Não consigo pensar em nenhum benefício em fazer essa varredura em paralelo, especialmente quando o tipo de transmissão é usado apenas para tabelas relativamente pequenas.

    Um caso em que suponho que isso poderia acontecer é se você tivesse uma junção de loop aninhado paralelo com uma tabela externa que continha 6 linhas e com uma varredura de tabela no lado interno da junção. Nesse caso, acredito que as varreduras de tabela serão concluídas por encadeamentos seriais independentes, de modo que cada núcleo faça sua própria varredura de tabela. É claro que essa consulta provavelmente terá um desempenho muito ruim e não é algo a ser almejado, especialmente quando a tabela externa tem mais de seis linhas.

    • 4

relate perguntas

  • Existe um ganho de desempenho ao manipular dados com procedimentos armazenados em vez de alimentá-los em funções após a recuperação?

  • Como você ajusta o MySQL para uma carga de trabalho pesada do InnoDB?

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

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

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