Oracle是否有任何逻辑上的理由不在SELECT列表中使用标量子查询并行执行?为什么不应该使用它们?
只有在以下情况下才能并行化SELECT语句 条件得到满足:
查询包含并行提示规范(PARALLEL或 PARALLEL_INDEX)或查询中引用的模式对象具有 与他们相关的PARALLEL声明。
查询中指定的至少一个表需要其中一个 以下内容:
全表扫描
跨越多个分区的索引范围扫描
SELECT列表中没有标量子查询。
答案 0 :(得分:4)
list中的每个项目都是错误的。
(至少对于Oracle 11gR2,也可能是10g。对于某些过时版本的Oracle,该列表可能是准确的。)
我建议尽可能使用官方的Oracle文档,但并行执行章节不是很准确。
即使手册没有错,也常常会产生误导,因为并行执行非常复杂。如果您查看所有文档,您会发现大约有30个不同的变量决定了并行度。如果你看到一个简短的项目清单,你应该非常怀疑。这些清单通常只是在特定背景下要考虑的最相关的项目。
示例:强>
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>
没有并行提示,没有并行对象,没有全表扫描,没有跨越多个分区的索引范围扫描,以及标量子查询。
没有遇到任何一个条件,但查询仍然使用并行性。 (我还验证了v$px_process
以确保查询确实使用了并行性,并且它不仅仅是解释计划失败。)
这意味着您other question的回答是错误的。
我不确定在这种情况下究竟发生了什么,但我认为这与FAST DUAL
优化有关。在某些情况下,DUAL不用作表,因此无需并行化。这可能是一个“bug”,但是如果你使用DUAL那么你真的不想要并行性。 (虽然我假设您使用DUAL进行演示,但您的真实查询更复杂。如果是这样,您可能需要使用更实际的示例更新查询。)