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

Junção de loop aninhado no Oracle 11g


Índice

O que é  Nested Loop Join in Oracle


-Para cada linha na fonte da primeira linha, acesse todas as linhas da fonte da segunda linha.
-O NESTED LOOPS Join é uma operação de junção que seleciona uma linha da fonte de linha inicial selecionada e usa os valores dessa fonte de linha para acessar ou selecionar a origem da linha unida procurando a linha correspondente.
-Melhor para transações do tipo OLTP
- será mais rápido se as linhas retornadas da primeira tabela forem pequenas

-Nested Loop Join no Oracle 11g funciona de maneira diferente. Detalhes sobre isso são fornecidos neste artigo

como a junção de loop aninhado funciona no Oracle


-O otimizador oracle primeiro determina a tabela de acionamento e a designa como o loop externo. Esta é a origem da linha de acionamento. Ele produz um conjunto de linhas para direcionar a condição de junção. A origem da linha pode ser uma tabela acessada usando varredura de índice ou varredura de tabela completa. As linhas também podem ser produzidas a partir de qualquer outra operação. Por exemplo, a saída de uma Junção de Loop Aninhado pode ser usada como uma fonte de linha.
-O otimizador designa outra tabela como Loop interno. Isso é iterado para cada linha retornada do loop externo. Esta é uma operação de acesso em uma tabela e, idealmente, deve ser uma varredura de índice.
-Operação realizada pela tabela INNER é repetida para cada linha retornada na tabela OUTER
for x in (select from outer table)
loop
for row in (select from inner table )
loop
joined output rows is returned where condition is matched
end loop
end loop

Exemplo de junção de loop aninhado
select /* +use_nl( a b) */ a.emp_no,b.dept_no,b.dept_name from emp a,dept b where a.dept_no=b.dept_no;
SELECT STATEMENT
NESTED LOOP
TABLE ACCESS FULL DEPT
TABLE ACCESS BY INDEX ROWID EMP
INDEX RANGE SCAN EMP_N1

Como é processado

(1) Leia a primeira linha em DEPT
(2) Faça a varredura de índice em EMP_N1 para correspondência dept_no e obtenha o primeiro rowid
(3) Procure a linha referenciada em EMP e junte as informações e forneça output
(4) Repita a operação 2,3 para cada rowid retornado
(5) Repita a operação 1,2,3,4 para todas as linhas em DEPT

para x in (selecione no departamento de tabela)
loop
para linha em (selecione na tabela emp)
loop
linhas de saída unidas são retornadas onde a condição é correspondida
end loop
finalizar loop

Aqui o método de acesso para selecionar da tabela emp seria através da varredura de índice
Se o otimizador estiver optando por usar algum outro método de junção, você pode usar a dica USE_NL(A B), onde A e B são os aliases das tabelas sendo juntado.

Cálculos de custo
Em uma junção NESTED LOOPS, para cada linha no conjunto de linhas externas, o conjunto de linhas internas é acessado para encontrar todas as linhas correspondentes a serem unidas. Portanto, nesse tipo de junção, o conjunto de linhas interno é acessado tantas vezes quanto o número de linhas do conjunto de linhas externo.
Custo :custo para acessar a tabela A + número de linhas retornadas da tabela A X custo para acessar a tabela B

Portanto, isso será econômico se pequenas linhas forem retornadas da tabela externa e a operação de acesso para a tabela interna for por meio de varredura exclusiva ou varredura de intervalo de índice pequeno

Novo método para junção de loop aninhado no Oracle 11g

SELECT STATEMENT
NESTED LOOPS
NESTED LOOPS
TABLE ACCESS FULL DEPT
INDEX UNIQUE SCAN EMP_IDX
TABLE ACCESS BY INDEX ROWID EMP

As documentações da Oracle dizem isso sobre
Quando um índice ou bloco de tabela não está no cache de buffer e é necessário para processar a junção, é necessária uma E/S física. No Oracle Database 11g Release 1 (11.1), o Oracle Database pode agrupar várias solicitações de E/S físicas e processá-las usando uma E/S vetorial em vez de processá-las uma de cada vez. Como parte da nova implementação para junções de loop aninhado, duas origens de linha de junção NESTED LOOPS podem aparecer no plano de execução onde apenas uma teria aparecido em versões anteriores. Nesses casos, o Oracle Database aloca uma fonte de linha de junção NESTED LOOPS para unir os valores da tabela no lado externo da junção com o índice no lado interno. Uma segunda fonte de linha é alocada para juntar o resultado da primeira junção, que inclui os rowids armazenados no índice oracle, com a tabela no lado interno da junção”

União externa de loops aninhados no Oracle


-Semelhante ao loop aninhado
-Linhas retornadas mesmo se o loop interno não tiver nenhuma linha que atenda aos critérios
-Ao contrário do loop aninhado que pode ser conduzido de qualquer uma das tabelas, esta é uma junção unidirecional
a =b(+) sempre irá para a antes de b, isso pode resultar em um plano mais caro (possivelmente não-NL)
(+) sempre vai para o lado deficiente

Também lê
Hash Join
Método Join no Oracle
https://en.wikipedia.org/wiki/Nested_loop_join