oracle - Oracle 中的 NOPARALLEL 和 PARALLEL 1 有什么区别?

标签 oracle parallel-processing

NOPARALLEL有什么区别和 PARALLEL 1 ?如果我像这样创建三个表:

CREATE TABLE t0 (i NUMBER) NOPARALLEL;
CREATE TABLE t1 (i NUMBER) PARALLEL 1;
CREATE TABLE t2 (i NUMBER) PARALLEL 2;
它们在数据字典中显示为
SELECT table_name, degree FROM user_tables WHERE table_name IN ('T0','T1','T2');

TABLE_NAME  DEGREE
T0               1 <==
T1               1 <==
T2               2
documentation ,然而,很清楚地说明

NOPARALLEL: Specify NOPARALLEL for serial execution. This is the default.

PARALLEL integer: Specification of integer indicates the degree of parallelism, which is the number of parallel threads used in the parallel operation. Each parallel thread may use one or two parallel execution servers.


所以,NOPARALLEL绝对是连续的,而 PARALLEL 1使用一个线程,可能使用一个或两个并行服务器???但是,当数据字典为两者存储相同的值 1 时,Oracle 如何区分它们呢?
顺便说一句,CREATE TABLE sys.tab$ ?/rdbms/admin/dcore.bsq 中的语句有评论
/* 
 * Legal values for degree, instances: 
 *     NULL (used to represent 1 on disk/dictionary and implies noparallel), or
 *     2 thru EB2MAXVAL-1 (user supplied values), or
 *     EB2MAXVAL (implies use default value) 
 */
degree        number,      /* number of parallel query slaves per instance */
instances     number,        /* number of OPS instances for parallel query */

最佳答案

NOPARALLEL之间没有区别和 PARALLEL 1 - 这些选项的存储方式和行为方式相同。这是一个文档错误,因为 Oracle 绝不会为 PARALLEL 1 使用两个并行执行服务器。 .我们可以通过查看 V$PX_PROCESS 来测试这种情况。并通过理解并行性的生产者/消费者模型。
如何测试并行性
衡量并行度的方法有很多,比如执行计划或者看GV$SQL.USERS_EXECUTING .但最好的方法之一是使用 View GV$PX_PROCESS .以下查询将显示当前使用的所有并行服务器:

select *
from gv$px_process
where status <> 'AVAILABLE';
生产者/消费者模型
如果您想全面了解 Oracle 并行性,则 VLDB 和分区指南的使用并行执行一章值得一读。特别是,阅读 Producer/Consumer Model手册中的部分来了解 Oracle 何时会将并行服务器的数量增加一倍。
简而言之 - 每个操作都是单独并行执行的,但这些操作需要相互馈送数据。全表扫描可能使用 4 个并行服务器读取数据,但 group by 或 order by 操作需要另外 4 个并行服务器对数据进行散列或排序。虽然并行度为4,但并行服务器的数量为8。这就是SQL Language Reference 中“每个并行线程可能使用一个或两个并行执行服务器”这句话的意思。
Oracle 不只是随机地将服务器数量增加一倍。加倍仅发生在某些操作中,例如 ORDER BY ,这让我们可以在 Oracle 启用并行性时进行精确测试。下面的测试表明 Oracle 不会将 1 个并行线程加倍到 2 个并行服务器。
测试
创建这三个表:
create table table_noparallel noparallel as select level a from dual connect by level <= 1000000;
create table table_parallel_1 parallel 1 as select level a from dual connect by level <= 1000000;
create table table_parallel_2 parallel 2 as select level a from dual connect by level <= 1000000;
运行以下查询,并在它们运行时使用单独的 session 针对 GV$PX_PROCESS 运行前面的查询.在这里使用 IDE 可能会有所帮助,因为您只需检索前 N 行并保持游标打开即可算作使用并行服务器。
--0 rows:
select * from table_noparallel;

--0 rows:
select * from table_noparallel order by 1;

--0 rows:
select * from table_parallel_1;

--0 rows:
select * from table_parallel_1 order by 1;

--2 "IN USE":
select * from table_parallel_2;

--4 "IN USE":
select * from table_parallel_2 order by 1;
请注意 NOPARALLELPARALLEL 1 table 的工作方式完全相同,它们都不使用任何并行服务器。但是PARALLEL 2 table 将导致结果排序时并行执行服务器的数量翻倍。
为什么是 PARALLEL 1甚至允许?
为什么 Oracle 不强制执行 PARALLEL子句只接受大于 1 的数字并避免这种歧义?毕竟,编译器已经实现了限制;条款PARALLEL 0将引发错误“ORA-12813:PARALLEL 或 DEGREE 的值必须大于 0”。
我猜想允许数值表示“无并行性”可以使一些代码更简单。例如,我编写了计算 DOP 并作为变量传递的程序。如果只使用数字,则动态 SQL 非常简单:
v_sql := 'create or replace table test1(a number) parallel ' || v_dop;
如果我们必须使用 NOPARALLEL ,代码变得有点丑陋:
if v_dop = 1 then
    v_sql := 'create or replace table test1(a number) noparallel';
else
    v_sql := 'create or replace table test1(a number) parallel ' || v_dop;
end if;

关于oracle - Oracle 中的 NOPARALLEL 和 PARALLEL 1 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68054144/

相关文章:

c++ - 为什么在尝试实现 OpenMPI 时设置单元数

java - 如何判断 Java 是 Sun/Oracle/OpenJDK?

sql - Oracle/general sql - 总是检查所有条件吗?

甲骨文 : Identifying duplicates in a table without index

python - 处理 Pandas 数据框

multithreading - Haskell:并行代码比顺序版本慢

cuda - 高性能计算术语 : What's a GF/s?

java - 将数据类型从 DB 类型转换为 java 数据类型

java - Oracle DataModeler 初始化 JavaFX 运行时时出现问题

bash 脚本并行 ssh 远程命令