1 并行查询
并行查询技术可以使单个 SQL 语句能利用多个 CPU 和磁盘设备的处理能力,可以通过多个线程来处理查询任务,从而提高查询的效率。
达梦数据库为具有多个 CPU 的数据库服务器提供并行查询的功能,以优化查询任务的性能。数据库服务器只有具有多个 CPU,才能使用并行执行查询操作,来提高查询任务的速度。
并行查询相关参数见下表:
2 确定并行任务个数
当开启自动并行(PARALLEL_POLICY=1)时,参数 MAX_PARALLEL_DEGREE 生效,控制并行查询最多使用的线程数。MAX_PARALLEL_DEGREE 缺省值为 1,表示不并行。此时若指定参数对应的 HINT “PARALLEL”,则使用 HINT 值;
当开启手动并行(PARALLEL_POLICY=2)时,参数 MAX_PARALLEL_DEGREE 失效,用户需要在语句中使用此参数对应的 HINT “PARALLEL”指定语句的并行度,否则不并行。
3. 并行功能
3.1 查询数据库默认并行设置
SQL> select para_name,para_value from v$dm_ini where para_name='PARALLEL_POLICY';
行号 PARA_NAME PARA_VALUE
---------- --------------- ----------
1 PARALLEL_POLICY 0
已用时间: 13.039(毫秒). 执行号:500.
3.2 调整并行参数
SQL> SP_SET_PARA_VALUE (2,'PARALLEL_POLICY',1);
DMSQL 过程已成功完成
已用时间: 3.395(毫秒). 执行号:501.
SQL> SP_SET_PARA_VALUE (1,'MAX_PARALLEL_DEGREE',4);
DMSQL 过程已成功完成
已用时间: 3.333(毫秒). 执行号:502.
3.3 重启数据库:
使用一般的 SQL 语句查询即可执行并行查询,不通过HINT指定默认也可以走执行计划:
#操作符:LOCAL COLLECT 表示本地并行下数据收集处理:
SQL> explain select * from sysobjects;
1 #NSET2: [1, 642, 396]
2 #LOCAL COLLECT: [1, 642, 396]; op_id(1) n_grp_by (0) n_cols(0) n_keys(0) for_sync(FALSE)
3 #PRJT2: [1, 642, 396]; exp_num(17), is_atom(FALSE)
4 #CSCN2: [1, 642, 396]; SYSINDEXSYSOBJECTS(SYSOBJECTS as SYSOBJECTS)
已用时间: 9.731(毫秒). 执行号:0.
4 使用“PARALLEL”关键字特别指定
当 PARALLEL_POLICY=2 时,需要在 SQL 语句中通过“PARALLEL”HINT 指定并行度,否则不并行。
若 PARALLEL_POLICY=1,则 SQL 语句中使用的“PARALLEL”HINT总是优先于 MAX_PARALLEL_DEGREE 参数设置。“PARALLEL”关键字的用法是在数据查询语句的 SELECT 关键字后,增加 HINT 子句来实现。
HINT 语法格式如下:
/*+ PARALLEL([<表名>] <并行任务个数>) */
在之前已经设置了 MAX_PARALLEL_DEGREE 默认值 4,但实际使用的为 PARALLEL 指定的任务个数 1(也就不用并行了):
SQL> explain select /*+ parallel(1) */ * from sysobjects;
1 #NSET2: [1, 642, 396]
2 #PRJT2: [1, 642, 396]; exp_num(17), is_atom(FALSE)
3 #CSCN2: [1, 642, 396]; SYSINDEXSYSOBJECTS(SYSOBJECTS as SYSOBJECTS)
已用时间: 0.723(毫秒). 执行号:0.