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)?
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)?
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 :
Ele continua falando sobre recursão de hash:
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 "operador de varredura de hash" mencionado há uma referência à classe interna
CQScanHash
emsqlmin.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.