Como posso impedir que o UNPIVOT seja transformado em UNION ALL?

13

Eu tenho uma consulta Oracle um tanto complexa que leva cerca de meia hora para ser concluída. Se eu pegar a parte lenta da consulta e executá-la separadamente, ela será concluída em alguns segundos. Aqui está uma captura de tela do relatório do SQL Monitor para a consulta isolada:

ok plano

Aqui está a mesma lógica quando executada como parte da consulta completa:

plano ruim

As cores correspondem às mesmas tabelas nas duas capturas de tela. Para a consulta lenta, a Oracle está fazendo umaMERGE JOIN tabela entre duas tabelas que não possuem uma condição de igualdade no JOIN. Como resultado, cerca de 150 milhões de linhas intermediárias são processadas desnecessariamente.

Sou capaz de solucionar esse problema com dicas ou reescritas de consulta, mas quero entender o máximo possível da causa raiz, para evitar esse problema no futuro e, possivelmente, enviar um relatório de bug à Oracle. Toda vez que recebo o plano ruim, oUNPIVOT texto da consulta é transformado em um UNION ALLno plano. Para investigar melhor, gostaria de impedir que a transformação da consulta ocorra. Não consegui encontrar um nome para essa transformação. Também não consegui encontrar uma dica de consulta ou um sublinhado que o impedirão. Estou testando em um servidor de desenvolvimento para que tudo dê certo.

Existe algo que eu possa fazer para impedir a transformação da consulta do UNPIVOT para UNION ALL? Estou no Oracle 12.1.0.2.

Não consigo compartilhar a consulta, nomes de tabelas ou dados por motivos de IP. Não consegui criar uma reprodução simples. Com isso dito, não está claro para mim por que essas informações são necessárias para responder à pergunta. Aqui está um exemplo de uma consulta UNPIVOT junto com a mesma consulta implementada como UNION ALL.

Joe Obbish
fonte
1
No seu exemplo de união, tudo existe, portanto, é mostrado. Fiz minha própria consulta que não possui uma união completa e o plano de explicação não mostra uma união completa. Então, talvez seja sua consulta e não a operação não dinâmica que está causando o problema aqui?
Raj
@Raj O objetivo é desativar essa transformação sem alterar o texto da consulta, a fim de diminuir ainda mais o problema.
21917 Joe Obbish
3
Trabalho com Oracle há muitos anos, mas às vezes preciso ver a consulta ou a pseudo consulta pelo menos compatível com suas colunas / tabelas substituídas. sem o qual eu posso continuar adivinhando, mas não é útil para você nem para mim.
Raj

Respostas:

1

Experimente a seguinte dica do otimizador Oracle:

NO_EXPAND

Essa dica desabilita a expansão OR. A expansão OR transforma condições OR ou listas IN combinadas na wherecláusula em uma consulta composta com o union all.

Como não temos o SQL, isso é um palpite, mas parece uma opção viável.

Como segunda opção, como você está em um ambiente de desenvolvimento, tente a dica do otimizador Oracle:

NO_QUERY_TRANSFORMATION

mas essa dica desabilita todas as transformações de consulta que o otimizador pode executar, exceto as que sempre podem aplicar.

tale852150
fonte
OU não é a mesma coisa que UNPIVOT. Você pode produzir um exemplo simples que mostra a dica NO_EXPAND trabalhando para UNPIVOT? Eu tentei isso e não funcionou para mim.
21417 Joe Obbish
@JoeObbish - Você pode fornecer uma versão reduzida do seu SQL complexo com o UNPiVOT, por favor? Eu gostaria de ajudá-lo se eu posso ...
tale852150
1
@ JoeObbish - resposta atualizada com outra sugestão. Espero que isto ajude.
tale852150