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

Hash join no Oracle com exemplo


Índice

O que é hash Join no Oracle?


As junções de hash são usadas quando a junção de tabelas grandes ou quando as junções requerem a maioria das linhas das tabelas unidas. Isso é usado apenas para junções de igualdade

Algoritmo para Oracle Hash Join


1) O otimizador usa a menor das 2 tabelas para construir uma tabela de hash na memória. A tabela pequena é chamada de tabela de construção

Fase de construção

Para cada linha no pequeno loop de tabela
Calcule o valor de hash na chave de junção
Insira a linha no bucket de hash apropriado.
Fim do loop;

2) em seguida, verifica as tabelas grandes e compara o valor de hash (das linhas da tabela grande) com esta tabela de hash para encontrar as linhas unidas. A tabela grande é chamada de tabela de sondagem

Fase de sonda

Para cada linha no loop de tabela grande
Calcule o valor de hash na chave de junção
Procure na tabela de hash o valor de hash
Se a correspondência for encontrada
Retorne linhas
Fim do loop;



A explicação acima é verdadeira quando a tabela de hash que está sendo desenvolvida cabe inteiramente na memória. Se a tabela de hash for muito grande para caber na memória disponível, o Oracle fará o processamento de maneira um pouco diferente. grande demais para caber na memória disponível O Oracle tem um mecanismo para salvá-lo no disco em lotes (chamados de partições) e salvar a tabela de teste no disco em lotes correspondentes, depois fazendo a junção por partes entre os lotes correspondentes

Basicamente, quando a área de hash for preenchida, o Oracle exigirá o uso do tablespace TEMP. O Oracle escolherá a maior partição com o hash e gravará isso em TEMP.Oracle mantém um índice semelhante a um bitmap de toda a tabela de hash na memória. Esse índice só sabe que para um determinado hash bucket (localização na tabela de hash) existe ou não um valor. Mas o índice não tem o valor real.

Portanto, se uma linha da segunda tabela ou tabela de sondagem hashes para um desses locais, a única coisa que se sabe é que existe uma correspondência em potencial. O processo de construção da tabela hash continua até que toda a tabela hash seja concluída. Parte da tabela hash está na memória e parte está no disco

Agora, o Oracle começa a ler o probe ou outra tabela e começa a criar o hash da chave de junção. Se a chave de hash corresponder ao hash na memória, a junção será concluída e a linha será retornada. armazenará esta linha no tablespace TEMP no mesmo esquema de particionamento que os dados da primeira linha foram mantidos.

Assim que a primeira passagem de toda a tabela secundária estiver concluída e todas as linhas na tabela de hash na memória forem fornecidas, o Oracle começará a procurar a partição correspondente no disco e processará cada partição uma a uma e lerá as linhas na memória e processar a saída

Exemplo de junção de hash no Oracle:

selecione /* +use_hash( a b) */ a.emp_no,b.dept_no,b.dept_name de emp a,dept b onde a.dept_no=b.dept_no;Plan---------- --------------------------------------------------SELECT STATEMENTHASH JOINTABLE ACCESS FULL EMPTABLE ACCESS FULL DEPT 
Como a junção de hash no Oracle é processada
1) A primeira tabela EMP é verificada e hash
2) a tabela dept é verificada para cada linha e o hash é criado para a manutenção da junção dept_no
3) dept_no hash é correspondido na tabela de hash , se uma correspondência for encontrada, as linhas unidas serão retornadas

dica de junção de hash do Oracle 


A Oracle forneceu a dica use_hash para forçar o uso da junção de hash.
Usageselect /* +use_hash(table alias) */ ......

Isso informa ao otimizador que o método de junção a ser usado quando “table_alias” for a próxima fonte de linha na ordem de junção deve ser uma junção de hash; no entanto, ele não informa ao otimizador se essa origem de linha deve ser usada como a tabela de compilação ou a tabela de análise.

Para especificar como a fonte de linha é usada, você precisa de uma segunda dica:no_swap_join_inputs(“table_alias”) se quiser que o Oracle use a fonte de linha como a tabela de teste, ou swap_join_inputs(“table_alias”) se quiser que o Oracle a use como a compilação tabela

Alguns pontos importantes sobre hash join no Oracle


1) A saída do resultado da junção de hash não é instantânea, pois a junção de hash é bloqueada na criação da tabela de hash. Uma vez que a compilação da tabela de hash é concluída, as linhas são retornadas mais rapidamente
2) Junções de hash são comumente vistas com o otimizador ALL_ROWS mode, porque funciona no modelo de mostrar resultados depois que todas as linhas de pelo menos uma das tabelas são hash na tabela de hash.
3) A tabela de hash é a memória privada, portanto, o acesso aos dados não incorre em muita atividade de travamento

Custo da associação de hash =Custo da leitura da tabela A + custo da leitura da tabela B + pouco processamento na memória

Diferença entre loop aninhado e junção de hash

União de hash União aninhada
As junções de hash são usadas quando a junção de tabelas grandes ou quando as junções requerem a maioria das linhas das tabelas unidas. Isso é usado apenas para junções de igualdade O NESTED LOOPS Join é uma operação de junção que seleciona uma linha da origem de linha inicial selecionada e usa os valores dessa origem de linha para direcionar ou selecionar da origem de linha unida procurando a linha correspondente.
-Melhor para transações do tipo OLTP
A operação de hash normalmente é eficiente para os dois conjuntos de dados quando muitos registros são retornados. Quando um conjunto de dados não tem nenhum ou um pequeno número de registros retornados e outro conjunto de dados pode ser correspondido usando a operação de índice, a junção de loop aninhado é mais eficiente
Você pode ver mais junções de hash usadas com o modo otimizador ALL_ROWS, porque ele funciona no modelo de exibição de resultados depois que todas as linhas de pelo menos uma das tabelas são hash na tabela de hash. Você verá mais uso do loop aninhado ao usar o modo otimizador FIRST_ROWS, pois ele funciona no modelo de mostrar resultados instantâneos ao usuário à medida que são buscados. Não há necessidade de selecionar o armazenamento em cache de nenhum dado antes que ele seja retornado ao usuário. No caso de junção de hash, é necessário e é explicado abaixo.