Í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. |