nếu subquery trả về một số lượng lớn các hàng so với số lượng hàng trong table1, tôi ưu hoa sẽ có khả năng tạo ra một kế hoạch như thế này:
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time
--------------------------------------------------------------------------------
| 0 | UPDATE STATEMENT | | 300K| 24M| | 1581 (1)| 00:0
| 1 | UPDATE | TABLE1 | | | | |
|* 2 | HASH JOIN SEMI | | 300K| 24M| 9384K| 1581 (1)| 00:0
| 3 | TABLE ACCESS FULL| TABLE1 | 300K| 5860K| | 355 (2)| 00:0
| 4 | TABLE ACCESS FULL| TABLE2 | 168K| 10M| | 144 (2)| 00:0
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("COL2"="COL2")
Nó sẽ quét cả hai bảng một lần và chỉ cập nhật hàng trong TABLE1 chung cho cả hai bảng. Đây là một kế hoạch hiệu quả cao nếu bạn cần cập nhật nhiều hàng.
Đôi khi truy vấn bên trong sẽ có vài hàng so với số hàng trong TABLE1. Nếu bạn có một chỉ mục trên TABLE1(col2)
, sau đó bạn có thể có được một kế hoạch tương tự như này:
-------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------
| 0 | UPDATE STATEMENT | | 93 | 4557 | 247 (1)| 00:00:03 |
| 1 | UPDATE | TABLE1 | | | | |
| 2 | NESTED LOOPS | | 93 | 4557 | 247 (1)| 00:00:03 |
| 3 | SORT UNIQUE | | 51 | 1326 | 142 (0)| 00:00:02 |
| 4 | TABLE ACCESS FULL| TABLE2 | 51 | 1326 | 142 (0)| 00:00:02 |
|* 5 | INDEX RANGE SCAN | IDX1 | 2 | 46 | 2 (0)| 00:00:01 |
-------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
5 - access("T1"."COL2"="T2"."COL2")
Trong trường hợp đó Oracle sẽ đọc các hàng từ table2 và cho mỗi (duy nhất) liên tiếp, thực hiện một truy cập chỉ mục trên table1 .
Truy cập nào nhanh hơn phụ thuộc vào tính chọn lọc của truy vấn bên trong và phân nhóm chỉ mục trên TABLE1 (các hàng có giá trị tương tự là col2
trong TABLE1 bên cạnh nhau hoặc phân tán ngẫu nhiên?). Trong mọi trường hợp, hiệu suất khôn ngoan, nếu bạn cần thực hiện cập nhật này, truy vấn này là một trong những cách nhanh nhất để làm điều đó.
Nguồn
2011-02-10 14:54:09
Nếu truy vấn con trả về 10000 kết quả, thời gian chạy sẽ bằng 0 khi nó phát ra lỗi. Tôi giả sử bạn muốn viết IN thay vì = cho subselect? –
Bạn đã hiểu. Tôi đã thực hiện thay đổi, cảm ơn bạn. – Vivek
nếu câu trả lời được cung cấp bởi @zerkms hữu ích cho bạn, vui lòng chấp nhận câu trả lời. Kiểm tra Câu hỏi thường gặp để biết lý do bạn nên làm điều này. :-) –