Wpis z mikrobloga

Oracle 12.1c

1. Czy dodanie warunku WHERE ROWNUM <= 1 powoduje wykonanie zapytania w całości (tak jakby warunku nie było) ale finalnie zwraca tylko jeden rekord czy może zapytanie wykonuje się szybciej bo kończy po odnalezieniu pierwszego wyniku?

2. Czy podzapytanie wewnątrz WHERE EXISTS() wykonuje się w całości zanim funkcja zwróci TRUE (zakładamy że coś by znalazło) czy może odnajduje pierwszy lepszy rekord, kończy wykonywanie podzapytania i zwraca TRUE?

#oracle #plsql #bazydanych #sql
  • 6
2) konczy po pierwszym odnalezionym


@ck__: To wytłumacz mi w takim razie dlaczego po dodaniu do podzapytania wewnątrz EXISTS warunku WHERE ROWNUM <= 1 koszt zapytania zmniejsza mi się drastycznie?
@AIRjordan @TomaszWKS Polecam zgłębić informacje o pseudokolumnie rownum https://blogs.oracle.com/oraclemagazine/on-rownum-and-limiting-results i czym jest koszt zapytania https://stackoverflow.com/questions/860450/understanding-the-results-of-execute-explain-plan-in-oracle-sql-developer
Nie jestem specem ale w Twoim przypadku (nie wiem jak wygląda całe zapytanie, które wykonujesz, jaka jest struktura tabel, indeksów, wolumen i rozmieszczenie danych) optymalizator kosztowy po prostu znalazł sobie plan do wykonania Twojego zapytania, który przy dodaniu warunku na rownum <= 1 ma mniej bloków do odczytu stąd koszt zapytania mniejszy. Nie widzę tu żadnego fenomenu,
@Esharell: Przeczytałem. Szczerze to średni ten artykuł o ROWNUM bo brakuje mi w nim podstawowej informacji (albo coś mi umknęło). Najpierw czytamy, że:

ROWNUM is a pseudocolumn (not a real column) that is available in a query. [..] A ROWNUM value is assigned to a row after it passes the predicate phase of the query


A później jeszcze:

The FROM/WHERE clause goes first.

ROWNUM is assigned and incremented to each output