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 / 243132
Accepted
Paul White
Paul White
Asked: 2019-07-18 12:47:55 +0800 CST2019-07-18 12:47:55 +0800 CST 2019-07-18 12:47:55 +0800 CST

Resgate agregado de hash

  • 772

Uma pergunta que surgiu em uma discussão no chat:

Eu sei que a junção de hash muda internamente para uma espécie de loops aninhados.

O que o SQL Server faz para um resgate agregado de hash (se puder acontecer)?

sql-server execution-plan
  • 1 1 respostas
  • 414 Views

1 respostas

  • Voted
  1. Best Answer
    Paul White
    2019-07-18T12:47:55+08:002019-07-18T12:47:55+08:00

    A junção de hash e a agregação de hash usam o mesmo código de operador internamente, embora uma agregação de hash use apenas uma única entrada (compilação). A operação básica do agregado de hash é descrita por Craig Freedman :

    Assim como na junção de hash, a agregação de hash requer memória. Antes de executar uma consulta com um agregado de hash, o SQL Server usa estimativas de cardinalidade para estimar quanta memória precisamos para executar a consulta. Com uma junção de hash, armazenamos cada linha de compilação, portanto, o requisito total de memória é proporcional ao número e tamanho das linhas de compilação. O número de linhas que se unem e a cardinalidade de saída da junção não afetam o requisito de memória da junção. Com um agregado de hash, armazenamos uma linha para cada grupo, de modo que o requisito total de memória seja realmente proporcional ao número e tamanho dos grupos ou linhas de saída. Se tivermos menos valores exclusivos do grupo por coluna(s) e menos grupos, precisamos de menos memória. Se tivermos mais valores exclusivos do grupo por coluna(s) e mais grupos, precisamos de mais memória.

    Ele continua falando sobre recursão de hash:

    Então, o que acontece se ficarmos sem memória? Novamente, como a junção de hash, se ficarmos sem memória, devemos começar a derramar linhas para tempdb. Derramamos um ou mais buckets ou partições, incluindo quaisquer resultados parcialmente agregados junto com quaisquer novas linhas adicionais que tenham hash para os buckets ou partições derramados. Embora não tentemos agregar as novas linhas derramadas, fazemos o hash e as dividimos em vários buckets ou partições. Assim que terminarmos de processar todos os grupos de entrada, produzimos os grupos na memória concluídos e repetimos o algoritmo lendo e agregando uma partição despejada de cada vez. Ao dividir as linhas derramadas em várias partições, reduzimos o tamanho de cada partição e, assim, reduzimos o risco de que o algoritmo precise se repetir muitas vezes.

    Resgate

    O resgate de hash é levemente documentado, mas mencionado por Nacho Alonso Portillo em Qual é o nível máximo de recursão para o iterador de hash antes de forçar o resgate?

    O valor é uma constante, codificada no produto, e seu valor é cinco (5). Isso significa que antes que o operador de varredura de hash recorra a um algoritmo baseado em classificação para qualquer subpartição que não se encaixe na memória concedida do espaço de trabalho, devem ter ocorrido cinco tentativas anteriores de subdividir a partição original em partições menores.

    O "operador de varredura de hash" mencionado há uma referência à classe interna CQScanHashem sqlmin.dll. Esta classe encabeça a implementação do operador de hash (em todas as suas formas, incluindo agregações parciais e fluxos distintos) que vemos nos planos de execução.

    Algoritmo de resgate

    Isso nos leva ao cerne de suas perguntas - o que exatamente o algoritmo de resgate faz? É "baseado em classificação" ou baseado em "uma espécie de coisa de loops aninhados"?

    É indiscutivelmente ambos, dependendo do seu ponto de vista. Quando a recursão de hash atinge o nível 5, a partição de hash na memória muda de uma tabela de hash para um índice de árvore b inicialmente vazio nos valores de hash. Cada linha de uma única partição hash derramada anteriormente é pesquisada no índice b-tree e inserida (novo grupo) ou atualizada (mantendo agregações) conforme apropriado.

    Essa série de inserções não ordenadas em uma b-tree também pode ser vista como uma ordenação por inserção ou como uma pesquisa de loops aninhados indexados.

    Em qualquer caso, é garantido que esse algoritmo de fallback seja concluído eventualmente sem alocar mais memória. Pode exigir várias passagens se o espaço disponível para a b-tree não for suficiente para conter todas as chaves de agrupamento e agregados da partição de estouro.

    Assim que a memória disponível para conter o índice b-tree estiver esgotada, quaisquer outras linhas (da partição derramada atual) são enviadas para uma única nova partição tempdb (que é garantidamente menor) e o processo se repete conforme necessário. O nível de derramamento permanece em 5 porque a recursão de hash terminou. Alguns detalhes de processamento podem ser observados com o sinalizador de rastreamento não documentado 7357.

    • 11

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