Ciekawostka bazy Oracle 25.04.2008
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