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

Dziwne zachowanie pełnego zewnętrznego sprzężenia w Oracle - jak to wytłumaczyć?

Optymalizator nie powinien decydować się na użycie indeksu EMP.DEPT_ID w drugim zapytaniu, ponieważ może on mieć wartości NULL. To właśnie powoduje wykluczenie jednego wiersza z wyników.

Jedyne wyjaśnienie bez błędów, jakie przychodzi mi na myśl, to to, że w jakiś sposób utworzyłeś ograniczenia w trybie DISABLE RELY, aby optymalizator myślał, że pole nie może zawierać wartości NULL. W takim przypadku poprawne byłoby użycie indeksu z nieprawidłowymi informacjami w ograniczeniach. Wygląda jednak na to, że opcja RELY nie jest dostępna dla ograniczeń NOT NULL, więc nie widzę, w jaki sposób może to stanowić problem. Niemniej jednak przyjrzyj się uważnie wszystkim ograniczeniom na stołach.

Poza tym na stronie Oracle jest zaskakująca liczba błędów dotyczących błędnych wyników z pełnych złączeń zewnętrznych. Możesz uderzyć jednego z nich. W wielu z tych przypadków obejściem jest wyłączenie „natywnych” pełnych sprzężeń zewnętrznych, co można zrobić dla bieżącej sesji za pomocą następującej instrukcji:

alter session set "_optimizer_native_full_outer_join"=off; 


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tajemniczy kod SQL blokujący wykonanie mojej procedury składowanej w systemie ORACLE

  2. Oracle RAC w chmurach innych firm

  3. Limit czasu połączenia dla DriverManager getConnection

  4. Produkty kartezjańskie i selekcje w klauzuli od

  5. Wykonywanie dynamicznej instrukcji sql do SYS_REFCURSOR