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:
Aqui está a mesma lógica quando executada como parte da consulta completa:
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 ALL
no 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.
fonte
Respostas:
Experimente a seguinte dica do otimizador Oracle:
Essa dica desabilita a expansão OR. A expansão OR transforma condições OR ou listas IN combinadas na
where
cláusula em uma consulta composta com ounion 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:
mas essa dica desabilita todas as transformações de consulta que o otimizador pode executar, exceto as que sempre podem aplicar.
fonte