Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Cách tối ưu hóa SQL cập nhật chạy trên bảng Oracle với 700 triệu hàng

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:
--------------------------------------------------------------------------------


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. kết nối tomcat bị gián đoạn sau một thời gian không hoạt động

  2. Sử dụng giá trị của một biến chuỗi trong vòng lặp SQL FOR-IN (SELECT)

  3. Triển khai ứng dụng .Net với Oracle Client 11

  4. Kết nối với Cơ sở dữ liệu Oracle thông qua C #?

  5. talend etl oracle error chèn hàng