Temat: pytanie sql do weryfikacji ORACLE
BZDURA.
Nie chcę być niegrzeczny, ale krzyczysz bez wyjaśnienia czegokolwiek.
Nie krzyczę. Poziom zwięzłości wypowiedzi był chyba adekwatny.
Miło by było gdybyś raczył rozwinąć swoją wypowiedź.
Oczywiscie.
Ja na przykład mogę się podeprzeć następującymi źródłami:
>http://download.oracle.com/docs/cd/B10501_01/em.920/a86647/vmqtune.htm
Nie znam się na wersji 9.0. To dość stara wersja. Uogólnianie tego na 10g (gdzie CBO - Cost Based Optimizer zaczal jako tako dzialac) i 11g to nadużycie. W metlainku nawet jest notka na ten temat, datowana na 2004, która zaleca uzywanie NOT EXISTS, ale raczej ze względu na to, że prościej jest ogarnąć konsekwencje niż NOT IN. Dodatkowo notka ta dotyczy wersji 7 Oracle.
Tak samo jak nadużyciem jest Twoje twierdzenie które sugeruje by używać NOT EXISTS zamiast NOT IN.
A jest to nadużycie dlatego, że:
1. To zależy od tego co chcesz osiągnąć i jakiego spodziewasz się planu. Jeśli odfiltrowujesz wiersze poprzez klucz główny (wyciągając kolumny klucza głównego jako podzapytanie w NOT IN lub ograniczasz wiersze podzapytania w NOT EXISTS) to faktycznie moze byc lepiej uzywajac indeksu i prosciej bedzie zmusic optymalizator poprzez odpowiedni hint do dostępu przez index(NESTED LOOPS ANTI JOIN). Ale spokojnie jestem w stanie sobie wyobrazic zapytanie gdzie lepszym planem będzie hash anti join i użycie indeksu (wielokrotnie bo NL) będzie gorsze niż sięgnięcie raz (nawet full scanem) do tabeli.
Generalnie roznica polega na tym, że NOT EXISTS to jest correlated subquery a NOT IN noncorrelated subquery i kazde z nich ma swoje zastosowanie.
Jesli interesuje Cie ten temat (correlated joinow i noncorellated), polecam ksiazke "Troubleshooting Oracle Performance" - Christian Antognini.
2. Twoje stwierdzenie sugeruje, że jeśli używam NOT IN to nie są używane indeksy. To jest pół prawdy. Bo nie są używane do złączenia, co nie znaczy ze w pierwszym podzapytaniu nie znajdzie się jakis warunek, ktory spowoduje wykorzystanie indeksu (na kolumnach innych niz złączenie). To samo dotyczy podzapytania w NOT IN.
http://hemantoracledba.blogspot.com/2009/07/difference...
Sam wstęp do tego artykułu rozwiewa tę legendę.
Z wyrazami szacunku.
Jacek Tomaka