Paging efficiente in SQLite con milioni di record


102

Devo mostrare i risultati di SQLite in una visualizzazione elenco. Ovviamente devo impaginare i risultati.

La prima opzione è utilizzare la clausola LIMIT. Per esempio:

SELECT * FROM Table LIMIT 100, 5000

Restituisce i record da 5001 a 5100. Il problema è che internamente SQLite "legge" i primi 5000 record e non è troppo efficiente.

Qual è l'approccio migliore per il paging quando sono presenti molti record?

Risposte:


118

Tieni presente che devi sempre utilizzare una ORDER BYclausola; in caso contrario, l'ordine è arbitrario.

Per eseguire una paginazione efficiente, salvare i primi / ultimi valori visualizzati dei campi ordinati e continuare subito dopo quando si visualizza la pagina successiva:

SELECT *
FROM MyTable
WHERE SomeColumn > LastValue
ORDER BY SomeColumn
LIMIT 100;

(Questo è spiegato con maggiori dettagli nel wiki SQLite .)

Quando hai più colonne di ordinamento (e SQLite 3.15 o versioni successive), puoi utilizzare un confronto del valore di riga per questo:

SELECT *
FROM MyTable
WHERE (SomeColumn, OtherColumn) > (LastSome, LastOther)
ORDER BY SomeColumn, OtherColumn
LIMIT 100;

8
Che ne dici di un caso in cui hai 101 valori identici in SomeColumn? Questo sembra essere migliore: blog.ssokolow.com/archives/2009/12/23/…
Jacek Ławrynowicz

6
@ JacekŁawrynowicz Se la colonna di ordinamento non è univoca, è necessario ordinare per più colonne. Ad ogni modo, se hai una risposta alternativa, crea una risposta.
CL.

@CL se voglio fare questo con la query di unione come fare con più condizioni AND
YLS

@YLS Al giorno d'oggi, puoi usare i valori di riga.
CL.

2
Il problema con questo approccio è spiegato brevemente da questo commento
mr5
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.