Oracle
 sql >> Baza danych >  >> RDS >> Oracle

ORACLE z 2 wiszącymi połączeniami po lewej stronie używających LITERAL dla predykatu na zewnętrznym JOIN wyklucza wiersz z LEWEJ skrajnej tabeli

Bardzo ciekawa obserwacja, chociaż nie mogłem jej odtworzyć w mojej bazie danych Oracle (wersja 12.1.0.2.0). Muszę wspomnieć, że używam Oracle Linux 6.5, a nie Windows. W każdym razie dobrze byłoby opublikować plan wykonania również dla tego prostego, ale interesującego zapytania.

Bardzo dziękujemy za opublikowanie planów wykonania, to bardzo dobrze wyjaśnia zachowanie zapytania. Następnie wyjaśnię, zaczynając od pierwszego planu wykonania:

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

Jak widać, optymalizator wybiera sprzężenie wewnętrzne zamiast lewego, co jest sygnalizowane przez „HASH JOIN”, a nie „HASH JOIN OUTER”, jak powinno być.

Szczerze mówiąc, nie słyszałem nic o takim błędzie (jak na razie), więc sugerowałbym następujące:

  • Sprawdź plik pfile/spfile, jeśli zawiera jakieś nieudokumentowane parametry.
  • Zdarzają się przypadki, w których ustawienie tych parametrów może poprawić wydajność, ale często, jak to się mówi, „karma to...”, co może prowadzić do nieoczekiwanych zachowań związanych z wykonywaniem/wydajnością w naprawdę bardzo zły sposób.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak sprawdzić, czy kolumna równa się empty_clob() w Oracle?

  2. Czy możliwe jest przepełnienie typu Oracle NUMBER?

  3. PL/SQL Online MCQ Quiz

  4. Wyjaśnienie dotyczące rownum

  5. wyrażenie oracle niewłaściwego typu podczas sprawdzania zmiennej