Có một tùy chọn khác: with
cú pháp. Để sử dụng ví dụ OPs, điều này sẽ giống như sau:
with data as (
select 'value1' name from dual
union all
select 'value2' name from dual
union all
...
select 'value10000+' name from dual)
select field1, field2, field3
from table1 t1
inner join data on t1.name = data.name;
Tôi gặp phải vấn đề này. Trong trường hợp của tôi, tôi có một danh sách dữ liệu trong Java trong đó mỗi mục có item_id và customer_id. Tôi có hai bảng trong DB với các mục đăng ký cho các khách hàng tương ứng. Tôi muốn nhận danh sách tất cả các đăng ký cho các mặt hàng hoặc khách hàng cho mặt hàng đó, cùng với id mặt hàng.
Tôi đã thử ba biến thể:
- Nhiều lựa chọn từ Java (sử dụng các bộ giá trị để vượt qua giới hạn)
- Với cú pháp
- Bảng tạm thời
Tùy chọn 1: Nhiều lựa chọn từ Java
Về cơ bản, tôi đầu tiên
select item_id, token
from item_subs
where (item_id, 0) in ((:item_id_0, 0)...(:item_id_n, 0))
Sau đó
select cus_id, token
from cus_subs
where (cus_id, 0) in ((:cus_id_0, 0)...(:cus_id_n, 0))
Sau đó, tôi tạo Bản đồ bằng Java với cus_id làm khóa và danh sách các mục dưới dạng giá trị, và đối với mỗi đăng ký khách hàng được tìm thấy, tôi thêm (vào danh sách được trả về từ lần chọn đầu tiên) một mục nhập cho tất cả các mục có liên quan với item_id đó. Đó là mã lộn xộn hơn nhiều
Tùy chọn 2: Với cú pháp
Nhận mọi thứ cùng một lúc với SQL như
with data as (
select :item_id_0 item_id, :cus_id_0 cus_id
union all
...
select :item_id_n item_id, :cus_id_n cus_id )
select I.item_id item_id, I.token token
from item_subs I
inner join data D on I.item_id = D.item_id
union all
select D.item_id item_id, C.token token
from cus_subs C
inner join data D on C.cus_id = D.cus_id
Tùy chọn 3: Bảng tạm thời
Tạo một bảng tạm thời chung với ba trường: rownr (khóa chính), item_id và cus_id. Chèn tất cả dữ liệu vào đó rồi chạy một lựa chọn rất giống với tùy chọn 2, nhưng liên kết trong bảng tạm thời thay vìwith data
Hiệu suất
Đây không phải là một phân tích hiệu suất đầy đủ khoa học.
- Tôi đang chạy với cơ sở dữ liệu phát triển, với hơn 1000 hàng trong tập dữ liệu mà tôi muốn tìm đăng ký.
- Tôi chỉ thử một tập dữ liệu.
- Tôi không ở cùng vị trí thực tế với máy chủ DB của mình. Nó không xa như vậy, nhưng tôi nhận thấy nếu tôi thử từ nhà qua VPN thì tất cả đều chậm hơn nhiều, mặc dù khoảng cách như nhau (và đó không phải là vấn đề với Internet tại nhà của tôi).
- Tôi đang thử nghiệm cuộc gọi đầy đủ, vì vậy API của tôi gọi một lệnh khác (cũng chạy trong cùng một phiên bản trong dev) cũng kết nối với DB để nhận tập dữ liệu ban đầu. Nhưng điều đó đều giống nhau trong cả ba trường hợp.
YMMV.
Điều đó nói rằng, tùy chọn bảng tạm thời chậm hơn nhiều . Như trong gấp đôi quá chậm. Tôi nhận được 14-15 giây cho tùy chọn 1, 15-16 cho tùy chọn 2 và 30 cho tùy chọn 3.
Tôi sẽ thử lại chúng từ cùng một mạng với máy chủ DB và kiểm tra xem điều đó có thay đổi mọi thứ hay không khi tôi có cơ hội.