Oracle
 sql >> Database >  >> RDS >> Oracle

Strategia di impaginazione di Oracle

Non hai detto se stavi pianificando di regolare "X" e "Y" ogni volta che esegui l'impaginazione. In caso contrario, l'approccio è probabilmente valido solo se si ha un'elevata certezza che i dati siano abbastanza statici.

Considera il seguente esempio:

La mia tabella T ha 100 righe di data e ora per "oggi", rispettivamente con ID =da 1 a 100 e voglio le ultime 20 righe per la mia prima pagina. Quindi faccio questo:

select * 
from T 
where date_col = trunc(sysdate) 
order by id desc
fetch first 20 rows only

Eseguo la mia query e ottengo ID =100 fino a 80. Fin qui tutto bene:è tutto sulla pagina dell'utente e impiegano 30 secondi per leggere i dati. Durante questo periodo sono stati aggiunti alla tabella altri 17 record (ID=101 a 117).

Ora l'utente preme "Pagina successiva"

Ora eseguo di nuovo la query per ottenere il set successivo

select * 
from T 
where date_col = trunc(sysdate) 
order by id desc
offset 20 fetch next 20 rows only

Non vedranno le righe da 80 a 60, che sarebbe la loro aspettativa, perché i dati sono cambiati. Lo farebbero

a) ottieni le righe ID=117 fino a 97 e saltale a causa dell'OFFSETb) quindi ottieni le righe ID=97 fino a 77 da visualizzare sullo schermo

Saranno confusi perché vedono più o meno lo stesso insieme di righe della prima pagina.

Per l'impaginazione contro la modifica dei dati, in genere si desidera evitare la clausola di offset e utilizzare l'applicazione per prendere nota di dove si è arrivati, ad esempio

Pagina 1

select * 
from T 
where date_col = trunc(sysdate) 
order by id desc
fetch first 20 rows only

Recupero ID=100 fino a 80... prendo nota degli 80. La mia prossima domanda sarà quindi

select * 
from T 
where date_col = trunc(sysdate) 
AND ID<80
order by id desc
fetch first 20 rows only

e la mia prossima domanda sarebbe

select * 
from T 
where date_col = trunc(sysdate) 
AND ID<60
order by id desc
fetch first 20 rows only

e così via.