Thông thường, bạn sẽ chỉ tham gia hai bảng.
FOR some_cursor IN (SELECT s.col1,
s.col2
FROM sometable s
JOIN temp_table t ON (s.col3 = t.col1))
LOOP
<<do something>>
END LOOP
Tuy nhiên, vì bạn lo lắng về hiệu quả
- Là
TEMP_TABLE
thực sự là một bảng tạm thời? Nếu vậy, tại sao? Rất hiếm khi Oracle thực sự cần sử dụng các bảng tạm thời, điều đó khiến tôi nghi ngờ rằng có lẽ bạn đang làm điều gì đó không hiệu quả để điền bảng tạm thời ngay từ đầu. - Tại sao bạn có con trỏ
FOR
vòng lặp để xử lý dữ liệu từTEMP_TABLE
? Xử lý từng hàng là cách chậm nhất để thực hiện bất kỳ điều gì trong PL / SQL, vì vậy, nó thường được tránh nếu bạn lo lắng về hiệu quả. Từ quan điểm hiệu suất, bạn muốn tối đa hóa SQL để thay vì thực hiện một vòng lặp đã thực hiện một loạtINSERT
một hàng hoặcUPDATE
hoạt động, bạn sẽ thực hiện mộtINSERT
hoặcUPDATE
đã sửa đổi toàn bộ tập hợp các hàng. Nếu bạn thực sự cần xử lý dữ liệu theo khối, thì đó là nơi mà các tập hợp PL / SQL và xử lý hàng loạt sẽ phát huy tác dụng nhưng điều đó sẽ không hiệu quả bằng SQL thẳng. - Tại sao bạn có
DISTINCT
trong truy vấn của bạn vớiTEMP_TABLE
? Bạn có thực sự mong đợi rằng sẽ cóbig_id
trùng lặp không các giá trị không bị sai sót? Hầu hết thời gian, mọi người sử dụngDISTINCT
không chính xác hoặc để che đậy các vấn đề trong đó dữ liệu được kết hợp không chính xác hoặc nơi bạn đang buộc Oracle thực hiện một phân loại đắt tiền đề phòng trường hợp dữ liệu không chính xác được tạo ra trong tương lai khi một ràng buộc sẽ là cách thích hợp hơn để bảo vệ bạn.