Meskipun logika Anda dan solusi di atas bagus untuk skala kecil, jika Anda berbicara tentang lebih dari 65000 item, Anda memerlukan solusi yang skalabel.
Saran saya adalah untuk membagi tugas ini menjadi 2 langkah.
Langkah 1
Buat tabel sementara, Tabel sementara ini akan memiliki 3 kolom minumum
TEMP_ITEM_ORDER_TABLE (
session_key varchar2(50),
item_id number,
item_report_order number
)
Setiap kali pengguna memesan kueri seperti itu, masukkan data, yaitu id item dan no urutnya ke dalam tabel sementara ini dengan beberapa kunci unik untuk mengidentifikasi sesi pengguna (mungkin id pengguna atau id sesi). Trik ini untuk menghindari tabrakan daftar item saat beberapa pengguna secara bersamaan mengaktifkan laporan.
Langkah 2
Sekarang jalankan kueri laporan Anda dengan bergabung dengan tabel utama Anda, tabel sementara dengan session_key
. Dalam data pesanan kueri berdasarkan pesanan input Anda (sudah disimpan di tabel temp)
SELECT
T1.* , T2.item_report_order
FROM ITEM T1, TEMP_ITEM_ORDER_TABLE T2
WHERE T1.ITEM_ID = T2.ITEM_ID
AND T2.session_key = :input_session_key
ORDER BY t2.item_report_order
Cara ini adalah
- agnostik basis data
- dapat diskalakan dengan sejumlah masukan
- Memberikan performa terbaik
Catatan:Untuk lebih meningkatkan kinerja kueri, buat indeks pada session_key, item_id di tabel temp juga buat indeks pada item_id pada tabel ITEM (jika belum ada)
Sunting:Oracle menawarkan Tabel Sementara Global fitur, yang dibuat memiliki fitur untuk mengizinkan catatan hanya dengan sesi dan pembersihan otomatis saat komit/akhir sesi dll. Anda dapat menggunakan fitur ini dan menghindari kunci sesi, tetapi solusi ini tidak dapat direplikasi pada produk database lain kecuali mereka mendukung fitur serupa.