Blog PeTe

Ciekawostka bazy Oracle 25.04.2008

Kategoria wpisu: Komputery, Programowanie — PeTe @ 10:37
Tags: ,

Oracle w wersji 10.2.0.3 zaskoczył mnie wczoraj totalnie. Na początek mały quiz:

Jeśli zapytanie:

select t.*
from tow t
where kod in (’011094′,’011105′);

zwraca dwa wiersze. To ile wierszy zwróci poniższe zapytanie?

select t.*
from tow t
where kod in (’011094′,’011105′)
and exists(select 1 from tow_v v where v.towaridpb||v.towarid = t.kod_p);


Odpowiedź jest prosta - co najwyżej dwa.

Chyba, że działamy na bazie Oracle 10.2.0.3 z włączoną optymalizacją kosztową, wówczas zapytanie to może zwrócić nawet 4 wiersze!

Jest to błąd optymalizatora kosztowego, który przepisuje sobie to zapytanie na ‘równoważne’. Niestety w tym przypadku nie jest ono równoważne :(

Błąd naprawiono w wersji 10.2.0.4.

 

Leave a Reply