Bagaimana Anda melakukannya LIMIT
di DB2 untuk iSeries?
Saya memiliki tabel dengan lebih dari 50.000 catatan dan saya ingin mengembalikan catatan 0 hingga 10.000, dan catatan 10.000 hingga 20.000.
Saya tahu di SQL Anda menulis LIMIT 0,10000
di akhir kueri untuk 0 hingga 10.000 dan LIMIT 10000,10000
di akhir kueri untuk 10.000 hingga 20.000
Jadi, bagaimana ini dilakukan di DB2? Apa kode dan sintaksnya? (contoh kueri lengkap dihargai)
db2
limit
ibm-midrange
elcool.dll
sumber
sumber
Jawaban:
Menggunakan
FETCH FIRST [n] ROWS ONLY
:http://publib.boulder.ibm.com/infocenter/dzichelp/v2r2/index.jsp?topic=/com.ibm.db29.doc.perf/db2z_fetchfirstnrows.htm
Untuk mendapatkan rentang, Anda harus menggunakan
ROW_NUMBER()
(sejak v5r4) dan menggunakannya dalamWHERE
klausa: (dicuri dari sini: http://www.justskins.com/forums/db2-select-how-to-123209.html )sumber
ROW_NUMBER
bukan kata kunci yang valid. Tapi terima kasih untuk tautannya, itu memberi saya ide dan berhasil.Mengembangkan metode ini:
Anda MEMBUTUHKAN meja yang memiliki nilai unik yang dapat dipesan.
Jika Anda menginginkan baris 10.000 hingga 25.000 dan Tabel Anda memiliki 40.000 baris, pertama-tama Anda perlu mendapatkan titik awal dan total baris:
int start = 40000 - 10000;
int total = 25000 - 10000;
Dan kemudian berikan ini dengan kode ke kueri:
sumber
Dukungan untuk OFFSET dan LIMIT baru-baru ini ditambahkan ke DB2 untuk i 7.1 dan 7.2. Anda memerlukan tingkat grup PTF DB berikut untuk mendapatkan dukungan ini:
Lihat di sini untuk informasi lebih lanjut: dokumentasi OFFSET dan LIMIT , DB2 untuk i Enhancement Wiki
sumber
Inilah solusi yang saya dapatkan:
Dengan menginisialisasi LASTVAL ke 0 (atau '' untuk bidang teks), lalu menyetelnya ke nilai terakhir di kumpulan rekaman terbaru, ini akan menelusuri tabel dalam potongan N catatan.
sumber
N
lebih kecil dari jumlah nilai yang identik di kolom (meskipun ini benar saat menggunakanROW_NUMBER()
juga). Nilai awal juga harus dipilih dengan hati-hati -0
jelas akan bermasalah jika kolom berisi nilai negatif . Perawatan akan dibutuhkan dengan nulls. Tidak akan berfungsi jika halaman dilewati.Solusi @ elcool adalah ide yang cerdas, tetapi Anda perlu mengetahui jumlah baris (yang bahkan dapat berubah saat Anda menjalankan kueri!). Jadi saya mengusulkan versi modifikasi, yang sayangnya membutuhkan 3 subkueri, bukan 2:
dimana
{last}
harus diganti dengan nomor baris dari record terakhir yang saya butuhkan dan{length}
harus diganti dengan jumlah baris yang saya butuhkan, dihitung sepertilast row - first row + 1
.Misalnya jika saya ingin baris dari 10 hingga 25 (total 16 baris),
{last}
akan menjadi 25 dan{length}
akan menjadi 25-10 + 1 = 16.sumber
Anda juga harus mempertimbangkan klausa OPTIMALKAN UNTUK n ROWS. Detail lebih lanjut tentang semua ini dalam dokumentasi DB2 LUW di Panduan untuk membatasi topik pernyataan SELECT :
sumber
Coba ini
sumber
Ada 2 solusi untuk membuat nomor halaman secara efisien pada tabel DB2:
1 - teknik menggunakan fungsi row_number () dan klausa OVER yang telah disajikan pada posting lain ("SELECT row_number () OVER (ORDER BY ...)"). Pada beberapa tabel besar, saya terkadang melihat penurunan kinerja.
2 - teknik menggunakan kursor yang dapat digulir. Implementasinya tergantung dari bahasa yang digunakan. Teknik itu tampaknya lebih kuat di tabel besar.
Saya mempresentasikan 2 teknik yang diterapkan di PHP selama seminar tahun depan. Slide tersedia di tautan ini: http://gregphplab.com/serendipity/uploads/slides/DB2_PHP_Best_practices.pdf
Maaf, dokumen ini hanya dalam bahasa Prancis.
sumber
Ada opsi yang tersedia ini: -
sumber