2013-01-22 16 views
63

Devo mostrare i risultati di SQLite in una visualizzazione elenco. Certo, ho bisogno di pagina i risultati.Paging efficiente in SQLite con milioni di record

La prima opzione consiste nell'utilizzare la clausola LIMIT. Per esempio:

SELECT * FROM Table LIMIT 100, 5000 

Esso restituisce i record 5001 al 5100. Il problema è che internamente SQLite "legge" i primi 5000 record e non è troppo efficiente.

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

+11

upvote extra per gli uomini lo svantaggio del LIMIT A, B! :) –

risposta

78

Si prega di notare che è sempre necessario utilizzare una clausola ORDER BY; altrimenti, ottieni solo un ordine casuale.

Per fare il paging efficace, salvare la prima/ultima visualizzati valori del campo ordinato (s), e continuare subito dopo di loro quando si visualizza la pagina successiva:

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

(Questo è spiegato con maggiore dettaglio on the SQLite wiki .)

Quando si dispone di più colonne di ordinamento (e SQLite 3.15 o successivo), è possibile utilizzare un row value comparison per questo:

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

Bel trucco, non lo sapevo. E grazie per il link, molto informativo! –

+4

Che dire di un caso in cui hai 101 valori identici in SomeColumn? Questo sembra essere migliore: http://blog.ssokolow.com/archives/2009/12/23/sql-pagination-without-offset/ –

+4

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

Problemi correlati