Como posso escolher dicas diferentes para junções diferentes para uma única tabela em uma dica de consulta?

StackOverflow https://stackoverflow.com/questions/2524248

Pergunta

Suponha que eu tenha a seguinte consulta:

select * from A, B, C, D
where A.x = B.x
and B.y = C.y
and A.z = D.z

Eu tenho índices em machado e bx e por cy e dz

Não há índice no AZ

Como posso dar uma dica a esta consulta para usar uma dica de índice no machado, mas uma dica de use_hash no AZ? Parece que dicas apenas pegam o nome da tabela, não a junção específica; portanto, ao usar uma única tabela com várias junções, só posso especificar uma única estratégia para todos eles.

Alternativo, suponha que estou usando uma dica líder ou ordenada na consulta acima. Ambas as dicas também tomam um nome de tabela, então como posso garantir que a junção ax = bx ocorra antes do AZ = DZ One? Sei que, neste caso, pude listar D primeiro, mas imagine D posteriormente se junta a E e que o DE JUNCE é o último que eu quero em toda a consulta.

Uma terceira configuração - suponha que eu queira que o machado se junte a ser o primeiro de toda a consulta, e eu quero que o AZ jun seja o último. Como posso usar uma dica para ter uma única junção de A para ocorrer, seguida pela junção do BC, e o anúncio se juntando por último?

Foi útil?

Solução

Primeiro de tudo, usar essas dicas deve ser o último recurso, não uma maneira normal de escrever consultas. Na maioria das vezes, você deve apenas garantir que as estatísticas do otimizador estejam atualizadas e deixe a CBO resolver o caminho ideal para si - esse é o seu trabalho!

A dica do índice pode especificar o nome do índice que você deseja usar assim:

SELECT /*+ INDEX (A, A_X_IDX) */ *
...

(Supondo que o índice no AX seja chamado A_X_IDX).

Você não pode dizer ao Oracle Use usar o índice no machado e Use um hash junte -se para a tabela A na mesma afirmação, que não faz sentido. No entanto, você pode (se precisar) especificar o caminho de acesso para cada tabela algo como:

SELECT /*+ INDEX (A, A_X_IDX) INDEX(B, B_Y_IDX) USE_HASH(C) */ *

Mas para reiterar, deve ser cru precisar fazer isso. A Oracle investiu milhões de dólares e Manhours no desenvolvimento da CBO, então por que desligá -lo efetivamente?

Outras dicas

No SQL Server, você faria uma dica de hash como esta

SELECT * FROM table1 t1
INNER hash join table2 t2 ON  t1.id = t2.id

E você também pode fornecer uma dica de índice

select * from table1 t1
inner  join table2 t2 with (index( bla))  on  t1.id = t2.id

Não sei como é a sintaxe no Oracle, btw por que você está usando o estilo antigo. Você ainda está no 8i?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top