Saya tidak begitu familiar dengan Oracle seperti yang saya inginkan. Saya memiliki sekitar 250 ribu rekaman, dan saya ingin menampilkannya 100 per halaman. Saat ini saya memiliki satu prosedur tersimpan yang mengambil semua seperempat juta catatan ke dataset menggunakan adaptor data, dan dataset, dan metode dataadapter.Fill (dataset) pada hasil dari proc yang disimpan. Jika saya memiliki "Nomor Halaman" dan "Jumlah data per halaman" sebagai nilai bilangan bulat yang dapat saya berikan sebagai parameter, cara terbaik apa untuk mendapatkan kembali bagian tersebut saja. Katakanlah, jika saya meneruskan 10 sebagai nomor halaman, dan 120 sebagai jumlah halaman, dari pernyataan pilih itu akan memberi saya 1880 hingga 1200, atau sesuatu seperti itu, matematika di kepala saya mungkin salah.
Saya melakukan ini di .NET dengan C #, saya pikir itu tidak penting, jika saya bisa melakukannya dengan benar di sisi sql, maka saya harus tenang.
Pembaruan: Saya dapat menggunakan saran Brian, dan itu bekerja dengan baik. Saya ingin mengerjakan beberapa pengoptimalan, tetapi halaman muncul dalam 4 hingga 5 detik, bukan satu menit, dan kontrol halaman saya dapat berintegrasi dengan sangat baik dengan procs baru saya yang tersimpan.
sumber
WHERE
tidak dapat digabungkanAND
, dan kemudian menemukan ini: orafaq.com/wiki/ROWNUMTanya Tom tentang pagination dan fungsi analitik yang sangat, sangat berguna.
Ini kutipan dari halaman itu:
sumber
Demi kelengkapan, bagi orang yang mencari solusi yang lebih modern, di Oracle 12c ada beberapa fitur baru termasuk paging yang lebih baik dan penanganan teratas.
Paging
Halamannya terlihat seperti ini:
Rekaman N Teratas
Mendapatkan rekor teratas terlihat seperti ini:
Perhatikan bagaimana kedua contoh kueri di atas memiliki
ORDER BY
klausa. Perintah baru menghormati ini dan dijalankan pada data yang diurutkan.Saya tidak dapat menemukan halaman referensi Oracle yang bagus untuk
FETCH
atauOFFSET
tetapi halaman ini memiliki gambaran umum yang bagus tentang fitur-fitur baru ini.Performa
Seperti yang ditunjukkan @wweicker pada komentar di bawah, kinerja adalah masalah dengan sintaks baru di 12c. Saya tidak memiliki salinan 18c untuk menguji apakah Oracle telah memperbaikinya.
Yang cukup menarik, hasil aktual saya dikembalikan sedikit lebih cepat saat pertama kali saya menjalankan kueri di tabel saya (113 juta + baris) untuk metode baru:
Namun, seperti yang disebutkan @wweicker, paket penjelasan terlihat jauh lebih buruk untuk metode baru:
Sintaks baru menyebabkan pemindaian penuh indeks di kolom saya, yang merupakan seluruh biaya. Kemungkinannya adalah, segalanya menjadi lebih buruk ketika membatasi pada data yang tidak diindeks.
Mari kita lihat saat menyertakan satu kolom yang tidak terindeks pada kumpulan data sebelumnya:
Ringkasan: gunakan dengan hati-hati sampai Oracle meningkatkan penanganan ini. Jika Anda memiliki indeks untuk dikerjakan, mungkin Anda bisa lolos dengan menggunakan metode baru.
Mudah-mudahan saya akan memiliki salinan 18c untuk segera dimainkan dan dapat memperbarui
sumber
Hanya ingin merangkum jawaban dan komentar. Ada beberapa cara melakukan penomoran halaman.
Sebelum oracle 12c tidak ada fungsi OFFSET / FETCH, jadi lihatlah whitepaper seperti yang disarankan @jasonk. Ini artikel terlengkap yang saya temukan tentang berbagai metode dengan penjelasan rinci tentang kelebihan dan kekurangan. Ini akan memakan banyak waktu untuk menyalin dan menempelkannya di sini, jadi saya tidak akan melakukannya.
Ada juga artikel bagus dari pencipta jooq menjelaskan beberapa peringatan umum dengan oracle dan pagination database lainnya. posting blog jooq
Kabar baik, sejak oracle 12c kami memiliki fungsionalitas OFFSET / FETCH baru. Fitur baru OracleMagazine 12c . Silakan merujuk ke "Top-N Queries and Pagination"
Anda dapat memeriksa versi oracle Anda dengan mengeluarkan pernyataan berikut
sumber
Coba yang berikut ini:
melalui [tecnicume]
sumber
Dalam proyek saya, saya menggunakan Oracle 12c dan java . Kode halamannya terlihat seperti ini:
sumber