Oracle
 sql >> Database >  >> RDS >> Oracle

ORACLE con 2 join a sinistra sospesi che usano LITERAL per predicato su JOIN esterno escludi la riga dalla maggior parte della tabella SINISTRA

Osservazione molto interessante, anche se non ho potuto riprodurla sul mio database Oracle (versione 12.1.0.2.0). Devo dire che sto usando Oracle Linux 6.5 e non Windows. Comunque, sarebbe bene pubblicare anche il piano di esecuzione, per questa query semplice ma interessante.

Grazie mille per aver pubblicato i piani di esecuzione, questo spiega molto bene il comportamento della query. Poi ti spiego, partendo dal primo piano di esecuzione:

|*  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 |

Come puoi vedere, l'ottimizzatore sceglie di fare un inner join, invece del left join, e questo viene mostrato da "HASH JOIN" e non da "HASH JOIN OUTER" come dovrebbe essere.

Ad essere onesto, non ho sentito nulla di un bug come questo (finora), quindi suggerirei quanto segue:

  • Controlla pfile/spfile se contiene alcuni parametri non documentati.
  • Ci sono casi in cui l'impostazione di questi parametri può migliorare le prestazioni, ma molte volte, "il karma è ...", come si suol dire, e puoi avere comportamenti di esecuzione/prestazioni imprevisti in un modo davvero davvero pessimo.