Paging yang efisien di SQLite dengan jutaan record

102

Saya perlu menunjukkan hasil SQLite dalam tampilan daftar. Tentu saja, saya perlu melihat hasilnya.

Opsi pertama adalah menggunakan klausa LIMIT. Sebagai contoh:

SELECT * FROM Table LIMIT 100, 5000

Ia mengembalikan catatan 5001 ke 5100. Masalahnya adalah bahwa secara internal SQLite "membaca" 5000 catatan pertama dan itu tidak terlalu efisien.

Apa pendekatan terbaik untuk paging jika ada banyak record?

Dabiel Kabuto
sumber

Jawaban:

118

Harap dicatat bahwa Anda selalu harus menggunakan ORDER BYklausa; jika tidak, urutannya sewenang-wenang.

Untuk melakukan paging yang efisien, simpan nilai pertama / terakhir yang ditampilkan dari bidang yang diurutkan, dan lanjutkan tepat setelahnya saat menampilkan halaman berikutnya:

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

(Ini dijelaskan lebih detail di wiki SQLite .)

Saat Anda memiliki beberapa kolom sortir (dan SQLite 3.15 atau yang lebih baru), Anda dapat menggunakan perbandingan nilai baris untuk ini:

SELECT *
FROM MyTable
WHERE (SomeColumn, OtherColumn) > (LastSome, LastOther)
ORDER BY SomeColumn, OtherColumn
LIMIT 100;
CL.
sumber
8
Bagaimana dengan kasus di mana Anda memiliki 101 nilai identik di SomeColumn? Ini tampaknya lebih baik: blog.ssokolow.com/archives/2009/12/23/…
Jacek Ławrynowicz
6
@ JacekŁawrynowicz Jika kolom pengurutan tidak unik, Anda perlu mengurutkan menurut lebih banyak kolom. Bagaimanapun, jika Anda memiliki jawaban alternatif, buatlah jawaban.
CL.
@CL jika saya ingin melakukan ini dengan kueri gabungan bagaimana melakukannya dengan beberapa kondisi DAN
YLS
@YLS Saat ini, Anda dapat menggunakan nilai baris.
CL.
2
Masalah yang menggunakan pendekatan ini secara singkat dijelaskan oleh komentar ini
mr5