Wydajne stronicowanie w SQLite z milionami rekordów


102

Muszę pokazać wyniki SQLite w widoku listy. Oczywiście muszę sprawdzić wyniki.

Pierwszą opcją jest użycie klauzuli LIMIT. Na przykład:

SELECT * FROM Table LIMIT 100, 5000

Zwraca rekordy od 5001 do 5100. Problem polega na tym, że wewnętrznie SQLite „czyta” pierwsze 5000 rekordów i nie jest to zbyt wydajne.

Jakie jest najlepsze podejście do stronicowania, gdy jest dużo rekordów?

Odpowiedzi:


118

Pamiętaj, że zawsze musisz użyć ORDER BYklauzuli; w przeciwnym razie kolejność jest dowolna.

Aby wykonać wydajne stronicowanie, zapisz pierwszą / ostatnią wyświetlaną wartość uporządkowanego pola (pól) i kontynuuj zaraz po nich przy wyświetlaniu następnej strony:

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

(Jest to wyjaśnione bardziej szczegółowo na wiki SQLite ).

Jeśli masz wiele kolumn sortowania (i SQLite 3.15 lub nowszy), możesz użyć do tego porównania wartości wierszy :

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

8
A co z przypadkiem, w którym masz 101 identycznych wartości w SomeColumn? Wydaje się, że jest lepiej: blog.ssokolow.com/archives/2009/12/23/…
Jacek Ławrynowicz

6
@ JacekŁawrynowicz Jeśli kolumna sortowania nie jest unikalna, należy posortować według większej liczby kolumn. W każdym razie, jeśli masz alternatywną odpowiedź, utwórz odpowiedź.
CL.

@CL, jeśli chcę to zrobić z połączeniem zapytania, jak to zrobić z wieloma warunkami AND
YLS

@YLS Obecnie możesz używać wartości wierszy.
CL.

2
Problem związany z tym podejściem jest pokrótce wyjaśniony w tym komentarzu
mr5
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.