乐趣区

PLSQL-Hints-Parallel-多线程

看完这章你会学习到以下内容:

  1. 为什要用这个 Hints 强制优化?
  2. 使用前的注意事项?
  3. 查询核心数和进程?

强制优化原因:

1. 对于一个大的任务,一般的做法是利用一个进程,串行的执行。
如果系统资源足够,可以采用 parallel 技术
核心思想:把一个大的任务分成若干个小的任务。
具体含义:同时启用 n 个进程 / 线程,并行的处理这些小的任务,这些并发的进程称为并行执行服务器(parallel executeion server),这些并发进程由一个称为并发协调进程的进程来管理。


启用 Parallel 前注意事项:
只有在需要处理一个很大的任务,如需要几十分钟,几个小时的作业中,并且 要有足够的系统资源 的情况下 (这些资源包括 cpu,内存,io)。您才应该考虑使用 parallel。
否则,在一个多并发用户下,系统本身资源负担已经很大的情况下,启用 parallel,将会导致某一个会话试图占用了所有的资源,其他会话不得不去等待,从而导致系统系能反而下降的情况。


通常语法:

Parallel(表名或者别名,并行数 -> 偶数)

 select /*+ parallel(emp,4)*/ 
  * from emp where deptno=200 and sal>300;

另外:
1. 每个 SELECT/INSERT/UPDATE/DELETE 命令后 只能有一个 /+ /
但提示内容可以有多个,可以用逗号分开,空格也可以
例如:既包含走索引,也包含用多线程。

 /+INDEX_ASC(TABLE INDEX_NAME) parallel(emp,4)*/

2. 如果表有别名,则 写别名,否则不会走 Hints 优化。

 Select /*+ parallel(e,4)*/   --- 会走 Hints 优化;
 * from emp e where deptno=200 and sal>300;
 
 Select /*+ parallel(emp,4)*/   --- 不会走 Hints 优化;
 * from emp e where deptno=200 and sal>300;

Q: 如何查询本机的核心数?
目的在于知道本机的核心数上限,可分配的范围。
打开命令窗口 Command Window, 输入如下命令:

SQL> show parameter CPU;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
cpu_count                            integer     8
parallel_threads_per_cpu             integer     2
resource_manager_cpu_allocation      integer     8

SQL> 

以下有三个参数返回:

  • cpu_count:表示 cpu 数
  • parallel_threads_per_cpu : 表示每个 cpu 允许的并行进程数
  • resource_manager_cpu_allocation : 该参数决定 Resource Manager 可以利用的 CPU 数,该参数已弃用,仅作向后兼容。

参考资料:

  • Oracle 参数解析(resource_manager_cpu_allocation)
  • Oracle-Hints 详解
  • Oracle Parallel 多线程
  • PLSQL_PLSQL Hint 用法总结(概念)
退出移动版