Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Qual é a diferença entre uma junção de hash e uma junção de mesclagem (Oracle RDBMS)?


Uma junção "sort merge" é realizada classificando os dois conjuntos de dados a serem unidos de acordo com as chaves de junção e, em seguida, mesclando-os. A mesclagem é muito barata, mas a classificação pode ser proibitivamente cara, especialmente se a classificação vazar para o disco. O custo da classificação pode ser reduzido se um dos conjuntos de dados puder ser acessado em ordem ordenada por meio de um índice, embora acessar uma alta proporção de blocos de uma tabela por meio de uma varredura de índice também possa ser muito caro em comparação com uma varredura de tabela completa .

Uma junção de hash é realizada fazendo hash de um conjunto de dados na memória com base nas colunas de junção e lendo o outro e sondando a tabela de hash para correspondências. A junção de hash tem um custo muito baixo quando a tabela de hash pode ser mantida inteiramente na memória, com o custo total chegando a muito pouco mais do que o custo de leitura dos conjuntos de dados. O custo aumenta se a tabela de hash tiver que ser derramada no disco em uma classificação de uma passagem e aumenta consideravelmente para uma classificação de várias passagens.

(No pré-10g, as junções externas de uma tabela grande para uma pequena eram problemáticas em termos de desempenho, pois o otimizador não conseguia resolver a necessidade de acessar a tabela menor primeiro para uma junção de hash, mas a tabela maior primeiro para uma junção externa. Consequentemente, as junções de hash não estavam disponíveis nessa situação).

O custo de uma junção de hash pode ser reduzido particionando ambas as tabelas na(s) chave(s) de junção. Isso permite que o otimizador deduza que as linhas de uma partição em uma tabela só encontrarão uma correspondência em uma partição específica da outra tabela e, para tabelas com n partições, a junção de hash é executada como n junções de hash independentes. Isso tem os seguintes efeitos:
  1. O tamanho de cada tabela de hash é reduzido, reduzindo assim a quantidade máxima de memória necessária e potencialmente eliminando a necessidade de a operação exigir espaço em disco temporário.
  2. Para operações de consulta paralela, a quantidade de mensagens entre processos é bastante reduzida, reduzindo o uso da CPU e melhorando o desempenho, pois cada junção de hash pode ser realizada por um par de processos PQ.
  3. Para operações de consulta não paralelas, o requisito de memória é reduzido por um fator de n, e as primeiras linhas são projetadas a partir da consulta anterior.

Você deve observar que as junções de hash só podem ser usadas para junções equitativas, mas as junções de mesclagem são mais flexíveis.

Em geral, se você estiver juntando grandes quantidades de dados em uma junção equitativa, uma junção de hash será uma aposta melhor.

Este tópico é muito bem abordado na documentação.

http://download.oracle.com/docs/cd/B28359_01/server.111/b28274/optimops.htm#i51523

12.1 documentos:https://docs.oracle.com/database/121/TGSQL/tgsql_join.htm