Mặc dù logic của bạn và các giải pháp ở trên phù hợp với quy mô nhỏ, nhưng nếu bạn đang nói về hơn 65000 mục, bạn cần một giải pháp có thể mở rộng.
Đề xuất của tôi là chia nhiệm vụ này thành 2 bước.
Bước 1
Tạo một bảng tạm thời, Bảng tạm thời này sẽ có 3 cột tối thiểu
TEMP_ITEM_ORDER_TABLE (
session_key varchar2(50),
item_id number,
item_report_order number
)
Mỗi khi người dùng đặt hàng một truy vấn như vậy, hãy chèn dữ liệu, tức là id mục và số thứ tự của chúng vào bảng tạm thời này với một số khóa duy nhất để xác định phiên người dùng (có thể là id người dùng hoặc id phiên). Thủ thuật này là để tránh xung đột danh sách mục khi nhiều người dùng đồng thời kích hoạt báo cáo.
Bước 2
Bây giờ hãy kích hoạt truy vấn báo cáo của bạn bằng cách tham gia bảng chính, bảng tạm thời với session_key
. Trong dữ liệu thứ tự truy vấn dựa trên thứ tự đầu vào của bạn (đã được lưu trữ trong bảng tạm thời)
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
Phương pháp này là
- cơ sở dữ liệu bất khả tri
- có thể mở rộng với bất kỳ số lượng đầu vào nào
- Mang lại hiệu suất tốt nhất có thể
Lưu ý:Để cải thiện hơn nữa hiệu suất truy vấn, hãy tạo chỉ mục trên session_key, item_id trong bảng tạm thời cũng tạo chỉ mục trên item_id trên bảng ITEM (nếu chưa tồn tại)
Chỉnh sửa:Oracle cung cấp Bảng tạm thời toàn cầu tính năng này tạo ra có các tính năng chỉ cho phép bản ghi trong phiên và tự động dọn dẹp khi cam kết / kết thúc phiên, v.v. Bạn có thể sử dụng tính năng này và tránh khóa phiên, nhưng giải pháp này không thể được sao chép trên các sản phẩm cơ sở dữ liệu khác trừ khi chúng hỗ trợ tính năng tương tự.