Sto lavorando con un DB Oracle che tenta di sintonizzare alcune query e ho difficoltà a capire perché il funzionamento di una particolare clausola in un modo particolare ha un impatto così drastico sulle prestazioni della query. Ecco una versione performante della query che sto facendoPerché queste query apparentemente simili hanno tempi di esecuzione così drasticamente differenti?
select * from
(
select a.*, rownum rn from
(
select *
from table_foo
) a where rownum <= 3
) where rn >= 2
La stessa query sostituendo le ultime due righe con questo
) a where rownum >=2 rownum <= 3
)
esegue orribilmente. Diversi ordini di grandezza peggio
) a where rownum between 2 and 3
)
esegue anche in modo orribile. Non capisco la magia della prima query e come applicarla a ulteriori query simili.
È possibile eseguire un'analisi di query ('EXPLAIN PLAIN', http://download.oracle.com/docs/cd/B19306_01/server.102/b14211/ex_plan.htm) per vedere come il DBMS esegue la query. – outis
Come nota a margine, perché 'selezionare *' quando si potrebbe semplicemente 'selezionare * da (selezionare a. *, Rownum rn da table_foo a dove rownum <= 3) dove rn> = 2'? –