konto usunięte

Temat: pytanie sql do weryfikacji ORACLE

Witam
mam pytanko można jkoś przerobic sql który pokażę mi cześć dwóch zapytan gdzie kolumny ccc mam puste:

Przykład
select * from
(select aaa, xxx from ddd) a
left join
(select ccc, xxx frmo) b on (b.xxx = a.xxx)
where ccc is null

zapytanie bez warunku where zwróci mi nastepujace wyniki

aaa|xxx|xxx_1|ccc
1 2 3 5
3 4 5
4 5 5
6 6 7 6

mnie interesują tylko wyniki gdzie dla kolumny ccc sa nule. ja zrobiłem to tak jak powyzej lecz przykład mało wydajny macie jakieś pomysły

OUTER JOIN nie zabardzo tu pasujeJakub Suchocki edytował(a) ten post dnia 01.02.10 o godzinie 19:46
Krzysztof Bielecki

Krzysztof Bielecki Senior consultant,
Capgemini Polska

Temat: pytanie sql do weryfikacji ORACLE

moze not exists ci pomoze ;)
Daniel N.

Daniel N. Senior IT Architect,
DBA

Temat: pytanie sql do weryfikacji ORACLE

Nie znam się na Oracle, (zajmuję się) uczę się T-SQL, w razie jakbym coś przeoczył...

Jakiej tabeli używasz w drugim zapytaniu?

SELECT aaa,xxx,ccc FROM ddd
WHERE ccc NOT IN
(SELECT ccc,xxx FROM ???)

Może NOT IN okażę się wydajniejsze ;)

ps. NOT EXISTS jest chyba bardziej wydajny, gdyż NOT IN nie zezwala Oracle na użycie indeksu jeśli takowy istnieje (tak wyczytałem)Daniel Nikratowicz edytował(a) ten post dnia 01.02.10 o godzinie 18:26

konto usunięte

Temat: pytanie sql do weryfikacji ORACLE

Poczytaj o OUTER JOIN? ;)

Temat: pytanie sql do weryfikacji ORACLE

ps. NOT EXISTS jest chyba bardziej wydajny, gdyż NOT IN nie zezwala Oracle na użycie indeksu jeśli takowy istnieje (tak wyczytałem)

BZDURA.
Daniel N.

Daniel N. Senior IT Architect,
DBA

Temat: pytanie sql do weryfikacji ORACLE

Jacek Tomaka:
ps. NOT EXISTS jest chyba bardziej wydajny, gdyż NOT IN nie zezwala Oracle na użycie indeksu jeśli takowy istnieje (tak wyczytałem)

BZDURA.
Nie chcę być niegrzeczny, ale krzyczysz bez wyjaśnienia czegokolwiek.
Miło by było gdybyś raczył rozwinąć swoją wypowiedź.

Ja na przykład mogę się podeprzeć następującymi źródłami:
http://download.oracle.com/docs/cd/B10501_01/em.920/a8... (see: "...Use NOT EXISTS instead of NOT IN...")
http://iherve.com/oracle/tune100.htm (see "Avoid NOT in or NOT = on indexed columns. They prevent the optimizer from using indexes.")
http://decipherinfosys.wordpress.com/2007/01/21/32/
http://hemantoracledba.blogspot.com/2009/07/difference...

Nie zajmuję się Oracle, ale zawsze lepiej wiedzieć coś więcej.

Pozdrawiam
Daniel Nikratowicz

Ps. Trochę zapomniałem o tym wątku, więc prostuję:
Rafał Wardas:
Poczytaj o OUTER JOIN? ;)
Rafale w 1 poście przeczytasz, że:
Jakub Suchocki:
OUTER JOIN nie zabardzo tu pasuje

Dodatkowo jeśli w wyniku zapytania pojawią się wartości NULL to NOT IN nie zwróci żadnych wyników gdyż NULL != NULL.

Przepraszam, że zapomniałem odpisać.Daniel Nikratowicz edytował(a) ten post dnia 25.02.10 o godzinie 09:25
Łukasz B.

Łukasz B. robię to co lubię :)

Temat: pytanie sql do weryfikacji ORACLE

not in raczej odpada no chyba ze masz mało rekordów w tabelkach :)

może

select *
from
ddd d,
zzz z
where
d.xxx = z.xxx(+) --(+) opcjonalnie
and z.ccc is null

btw. not exists nie może być użyty bo Jakub potrzebuje kolumnę aaa

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

Temat: pytanie sql do weryfikacji ORACLE

Jakub Suchocki:
Witam
mam pytanko można jkoś przerobic sql który pokażę mi cześć dwóch zapytan gdzie kolumny ccc mam puste:

Przykład
select * from
(select aaa, xxx from ddd) a
left join
(select ccc, xxx frmo) b on (b.xxx = a.xxx)
where ccc is null
Zapytanie generalnie jest ok. Jaki plan Ci to generuje?
Podstawowy problem jest taki, że warunek where ccc is null uniemozliwia skorzystanie z indeksu jako access predicate.

Ja bym to zapytanie napisal jednak tak:
select /*+ORDERED*/* from
(select ccc,xxx from b where cccc is null) b, a
where b.xxx = a.xxx;

Oba zapytania są rownowazne. W sensie.... Mogą wygenerować te same plany. Moje zapytanie jest bliższe temu jak chcialbym zeby Oracle to policzyl, ale to nie znaczy ze bedzie tak jak chce. W koncu to Oracle :)Jacek Tomaka edytował(a) ten post dnia 28.02.10 o godzinie 10:48
Daniel N.

Daniel N. Senior IT Architect,
DBA

Temat: pytanie sql do weryfikacji ORACLE

Super wyjaśnienie. Dzięki, że się zdecydowałeś.
Myślę, że nie tylko ja skorzystam ;)

Następna dyskusja:

zapytanie sql oracle




Wyślij zaproszenie do