oracle并行度使用多个cpu与io来执行数据库操作,能够显著改善大型数据库操作性能,比如DSS或数据仓库 适用于 大表查询,join,分区索引的查询 创建大量的index 创建大量的表(包括固化视图) 批量的insert,update,delete 查行执行适合场景 对称多处理器,集群
oracle并行度使用多个cpu与io来执行数据库操作,能够显著改善大型数据库操作性能,比如DSS或数据仓库
适用于
大表查询,join,分区索引的查询
创建大量的index
创建大量的表(包括固化视图)
批量的insert,update,delete
查行执行适合场景
对称多处理器,集群,并行系统
足够的带宽
cpu利用不足
足够的内存用于其他操作,排序,hash,缓存
查行执行适合与dss与数据仓库,也适合于批量操作的OLTP系统,不适合OLTP简介的dml或select操作
并行执行不适合场景
非常短的查询或事务
这包括大多数的OLTP,因为并行协调的成本高于并行的好处
大量利用io,cpu,内存的操作
基本硬件要求
并行执行设计需要多个cpu与io来实现快速的查询,每个硬件都应该维持在同一个吞吐量
哪些操作可以用并行
全表查询,分区查询,索引快速查询
join操作
nested loop, sort merge, hash, and star transformation
DDL语句
CREATE
TABLE
AS
SELECT
, CREATE
INDEX
, REBUILD
INDEX
, REBUILD
INDEX
PARTITION
,
and MOVE
/SPLIT
/COALESCE
PARTITION
DML语句
<code>INSERT
AS
SELECT
, UPDATE
, DELETE
,
and MERGE
operations
<span>并行执行的执行计划</span>
执行
EXPLAIN PLAN FOR SELECT /*+ PARALLEL(4) */ customers.cust_first_name, customers.cust_last_name, MAX(QUANTITY_SOLD), AVG(QUANTITY_SOLD) FROM sales, customers WHERE sales.cust_id=customers.cust_id GROUP BY customers.cust_first_name, customers.cust_last_name;
查看执行计划
SELECT PLAN_TABLE_OUTPUT FROM TABLE(DBMS_XPLAN.DISPLAY());
执行并行程度
<span><span><span><span><span lang="en-US">ALTER TABLES sales PARALLEL 8;</span></span></span></span></span> <span><span><span>ALTER TABLE customers PARALLEL 4</span></span></span>
默认并行度
单实例:PARALLEL_THREADS_PER_CPUx CPU_COUNT
集群: <span><span><span><span lang="en-US">PARALLEL_THREADS_PER_CPUx
CPU_COUNT x INSTANCE_COUNT</span></span></span></span>
<span><span><span><span lang="en-US">parallel_threads_per_cpu</span></span></span></span>
<span><span><span><span lang="zh-CN">查询</span></span></span></span>
<span><span><span><span lang="en-US">showparameter
parallel_threads_per_cpu</span></span></span></span>
PARALLEL_DEGREE_POLICY设置为auto说明由oracle决定并行执行
自动并行流程
sql发布
oracle优化解析并生成执行计划
查看PARALLEL_MIN_TIME_THRESHOLD参数值
如果执行时间小于该值就串行执行否则并行执行
<span><span><span><span lang="zh-CN">设置自动并行度</span></span></span></span>
<span><span><span><span lang="zh-CN">方法</span></span></span></span>
<span><span><span><span lang="en-US">1</span></span></span></span>
<span><span><span><span lang="en-US">altersession set parallel_degree_policy=limited;</span></span></span></span>
<span><span><span><span lang="en-US">altertable paralle(degree
default);</span></span></span></span>
<span><span><span><span lang="zh-CN">方法</span></span></span></span>
<span><span><span><span lang="en-US">2</span></span></span></span>
<span><span><span><span lang="zh-CN">通过语句设置并行度</span></span></span></span>
<span><span><span><span lang="zh-CN">并行度</span></span></span></span>
<span><span><span><span lang="en-US">10</span></span></span></span>
<span><code><span><span><span><span lang="en-US">SELECT /*+ parallel(10) */ ename, dname FROM emp e, dept d</span></span></span></span></code></span> <span><span><span>WHERE e.deptno=d.deptno;</span></span></span>
<span><span><span><span lang="zh-CN">非并行度</span></span></span></span>
<span><code><span><span><span><span lang="en-US">SELECT /*+ no_parallel */ ename, dname FROM emp e, dept d</span></span></span></span></code></span> <span><span><span>WHERE e.deptno=d.deptno;</span></span></span>
<span><span><span><span lang="zh-CN">自动并行度</span></span></span></span>
<span><code><span><span><span><span lang="en-US">SELECT /*+ parallel(auto) */ ename, dname FROM emp e, dept d</span></span></span></span></code></span> <span><span><span>WHERE e.deptno=d.deptno;</span></span></span>
PARALLEL_DEGREE_POLICY设置为auto表示并行执行时利用buffer cache数据,
PARALLEL_ADAPTIVE_MULTI_USER默认为true保证自适应并行执行,oracle根据执行时间来决定是否来并行执,从而避免超载
PARALLEL_DEGREE_POLICY参数数决定是否自动DOP,并行语句队列,In-Meory并行执行
有以下几个值
MANUAL 关闭auto DOP,并行语句队列,In-Memory并行,在11.2为默认
LIMITED关闭auto DOP,但开启并行语句队列,In-Memory并行,可以在语句中加入DOP设置来并行执
AUTO开启所有三项
并行DML
alter session enable parallel dml;
只有设置了DML并行才会在适合的语句调用并行
在insert 的SQL中使用APPEND,如:
Insert /*+append */ into t select * from t1;
Oracle 执行直接加载时,数据直接追加到数据段的最后,不需要花费时间在段中需找空间,数据不经过data buffer直接写到数据文件中,效率要比传统的加载方式高。