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

ORACLE com 2 junções à esquerda pendentes usando LITERAL para predicado no JOIN externo exclui a linha da maioria da tabela LEFT


Observação muito interessante, embora não consegui reproduzi-la no meu banco de dados Oracle (versão 12.1.0.2.0). Devo mencionar que estou usando Oracle Linux 6.5 e não Windows. De qualquer forma, seria bom postar o plano de execução também, para esta consulta simples, mas interessante.

Muito obrigado por postar os planos de execução, isso explica muito bem o comportamento da consulta. Depois explicarei, começando pelo primeiro plano de execução:
|*  2 |   HASH JOIN        |      |     1 |    17 |     8   (0)| 00:00:01 |
|   3 |    VIEW            |      |     2 |    14 |     4   (0)| 00:00:01 |
|   4 |     SORT UNIQUE    |      |     2 |       |     4  (50)| 00:00:01 |
|   5 |      UNION-ALL     |      |       |       |            |          |
|   6 |       FAST DUAL    |      |     1 |       |     2   (0)| 00:00:01 |
|   7 |       FAST DUAL    |      |     1 |       |     2   (0)| 00:00:01 |
|   8 |    VIEW            |      |     2 |    20 |     4   (0)| 00:00:01 |
|   9 |     SORT UNIQUE    |      |     2 |       |     4  (50)| 00:00:01 |
|  10 |      UNION-ALL     |      |       |       |            |          |
|  11 |       FAST DUAL    |      |     1 |       |     2   (0)| 00:00:01 |
|  12 |       FAST DUAL    |      |     1 |       |     2   (0)| 00:00:01 |

Como você pode ver, o otimizador opta por fazer uma junção interna, em vez da junção esquerda, e isso é mostrado pelo "HASH JOIN" e não pelo "HASH JOIN OUTER" como deveria ser.

Para ser honesto, eu não ouvi nada sobre um bug como este (até agora), então sugiro o seguinte:
  • Confira o pfile/spfile se ele contiver alguns parâmetros não documentados.
  • Há casos em que definir esses parâmetros pode melhorar o desempenho, mas muitas vezes, "karma é ...", como diz o ditado, e você pode ter comportamentos inesperados de execução/desempenho de uma maneira muito ruim.