共计 1319 个字符,预计需要花费 4 分钟才能阅读完成。
看完这章你会学习到以下内容:
- 为什要用这个 Hints 强制优化?
- 使用前的注意事项?
- 查询核心数和进程?
强制优化原因:
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 用法总结(概念)
正文完