Trước hết đó là truy vấn một lần hay là truy vấn lặp lại? Nếu bạn chỉ phải làm điều đó một lần, bạn có thể muốn xem xét việc chạy truy vấn ở chế độ song song. Bạn vẫn sẽ phải quét tất cả các hàng, bạn có thể tự phân chia khối lượng công việc với phạm vi ROWID (song song tự làm) hoặc sử dụng các tính năng tích hợp sẵn của Oracle.
Giả sử bạn muốn chạy nó thường xuyên và muốn tối ưu hóa truy vấn này, số hàng có trường field
cột dưới dạng NULL cuối cùng sẽ nhỏ so với tổng số hàng. Trong trường hợp đó, một chỉ mục có thể tăng tốc mọi thứ. Oracle không lập chỉ mục các hàng có tất cả các cột được lập chỉ mục là NULL nên chỉ mục trên trường field
sẽ không được truy vấn của bạn sử dụng (vì bạn muốn tìm tất cả các hàng có field
là NULL).
Một trong hai:
- tạo một chỉ mục trên
(FIELD, 0)
,0
sẽ hoạt động như một cột giả không phải NULL và tất cả các hàng sẽ được lập chỉ mục trên bảng. -
tạo chỉ mục dựa trên chức năng trên
(CASE WHEN field IS NULL THEN 1 END)
, điều này sẽ chỉ lập chỉ mục các hàng là NULL (do đó chỉ mục sẽ rất nhỏ gọn). Trong trường hợp đó, bạn sẽ phải viết lại truy vấn của mình:UPDATE [TABLE] SET [FIELD]=0 WHERE (CASE WHEN field IS NULL THEN 1 END)=1
Chỉnh sửa:
Vì đây là tình huống một lần, bạn có thể muốn sử dụng PARALLEL
gợi ý:
SQL> EXPLAIN PLAN FOR
2 UPDATE /*+ PARALLEL(test_table 4)*/ test_table
3 SET field=0
4 WHERE field IS NULL;
Explained
SQL> select * from table( dbms_xplan.display);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 4026746538
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time
--------------------------------------------------------------------------------
| 0 | UPDATE STATEMENT | | 22793 | 289K| 12 (9)| 00:00:
| 1 | UPDATE | TEST_TABLE | | | |
| 2 | PX COORDINATOR | | | | |
| 3 | PX SEND QC (RANDOM)| :TQ10000 | 22793 | 289K| 12 (9)| 00:00:
| 4 | PX BLOCK ITERATOR | | 22793 | 289K| 12 (9)| 00:00:
|* 5 | TABLE ACCESS FULL| TEST_TABLE | 22793 | 289K| 12 (9)| 00:00:
--------------------------------------------------------------------------------