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

Oracle:có lý do hợp lý nào để không sử dụng thực thi song song với các truy vấn con trong danh sách SELECT không?

Mọi mục trong danh sách đó đều sai.

(Ít nhất là đối với Oracle 11gR2 và có thể là 10g nữa. Danh sách có thể chính xác đối với một số phiên bản lỗi thời của Oracle.)

Tôi khuyên bạn nên sử dụng tài liệu Oracle chính thức bất cứ khi nào có thể, nhưng chương thực thi song song không chính xác lắm.

Và ngay cả khi hướng dẫn sử dụng không sai, nó thường gây hiểu nhầm, bởi vì việc thực hiện song song rất phức tạp. Nếu bạn xem qua tất cả các tài liệu, bạn sẽ thấy có khoảng 30 biến số khác nhau xác định mức độ song song. Nếu bạn từng nhìn thấy một danh sách kiểm tra ngắn của các mục, bạn nên rất nghi ngờ. Những danh sách kiểm tra đó thường chỉ là những mục có liên quan nhất để xem xét trong một bối cảnh rất cụ thể.

Ví dụ:

SQL> --Create a table without any parallel settings
SQL> create table parallel_test(a number primary key, b number);

Table created.

SQL> --Create some test data
SQL> insert into parallel_test
  2  select level, level from dual connect by level <= 100000;

100000 rows created.

SQL> commit;

Commit complete.

SQL> --Force the session to run the query in parallel
SQL> alter session force parallel query;

Session altered.
SQL> --Generate explain plan
SQL> explain plan for
  2  select a
  3     ,(
  4             select a
  5             from parallel_test parallel_test2
  6             where parallel_test2.a = parallel_test.a
  7     )
  8  from parallel_test;

Explained.

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------
Plan hash value: 3823224058

---------------------------------------------------------------------------------------------------------------------
| Id  | Operation               | Name         | Rows  | Bytes | Cost (%CPU)| Time     |    TQ  |IN-OUT| PQ Distrib |
---------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT        |              |   116K|  1477K|     9   (0)| 00:00:01 |        |      |            |
|*  1 |  INDEX UNIQUE SCAN      | SYS_C0028894 |     1 |    13 |     1   (0)| 00:00:01 |        |      |            |
|   2 |  PX COORDINATOR         |              |       |       |            |          |        |      |            |
|   3 |   PX SEND QC (RANDOM)   | :TQ10000     |   116K|  1477K|     9   (0)| 00:00:01 |  Q1,00 | P->S | QC (RAND)  |
|   4 |    PX BLOCK ITERATOR    |              |   116K|  1477K|     9   (0)| 00:00:01 |  Q1,00 | PCWC |            |
|   5 |     INDEX FAST FULL SCAN| SYS_C0028894 |   116K|  1477K|     9   (0)| 00:00:01 |  Q1,00 | PCWP |            |
---------------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - access("PARALLEL_TEST2"."A"=:B1)

Note
-----
   - dynamic sampling used for this statement (level=2)

21 rows selected.

SQL>

Không có gợi ý song song, không có đối tượng song song, không quét toàn bộ bảng, không quét phạm vi chỉ mục bao gồm nhiều phân vùng và truy vấn con vô hướng.

Không một điều kiện nào được đáp ứng , nhưng truy vấn vẫn sử dụng song song. (Tôi cũng đã xác minh v$px_process để đảm bảo rằng truy vấn thực sự sử dụng song song và nó không chỉ là một thất bại của kế hoạch giải thích.)

Điều này có nghĩa là câu trả lời cho câu hỏi khác của bạn là sai.

Tôi không chắc chính xác chuyện gì đang xảy ra trong trường hợp đó, nhưng tôi nghĩ nó liên quan đến FAST DUAL tối ưu hóa. Trong một số ngữ cảnh, DUAL không được sử dụng như một bảng, vì vậy không có gì để song song hóa. Đây có lẽ là một "lỗi", nhưng nếu bạn đang sử dụng DUAL thì bạn thực sự không muốn song song. (Mặc dù tôi cho rằng bạn đã sử dụng DUAL cho mục đích trình diễn và truy vấn thực của bạn phức tạp hơn. Nếu vậy, bạn có thể cần cập nhật truy vấn bằng một ví dụ thực tế hơn.)




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách lặp qua danh sách được phân tách trong Oracle PLSQL

  2. GROUP BY hoạt động như thế nào?

  3. Làm cách nào để sử dụng TẠO HOẶC THAY THẾ?

  4. ĐẶT SQLBLANKLINES:Cách Cho phép Dòng trống trong SQLcl &SQL * Plus

  5. Oracle's SYS_GUID () UUID RFC 4122 có tuân thủ không?