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
, andMOVE
/SPLIT
/COALESCE
PARTITION
DML语句
INSERTASSELECT,UPDATE,DELETE, andMERGEoperations
并行执行的执行计划
执行
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());
执行并行程度
ALTER TABLES sales PARALLEL 8;
ALTER TABLE customers PARALLEL 4
默认并行度
单实例:PARALLEL_THREADS_PER_CPUx CPU_COUNT
集群:PARALLEL_THREADS_PER_CPUx CPU_COUNT x INSTANCE_COUNT
parallel_threads_per_cpu
查询
showparameter parallel_threads_per_cpu
自动并行管理
PARALLEL_DEGREE_POLICY设置为auto说明由oracle决定并行执行
自动并行流程
sql发布
oracle优化解析并生成执行计划
查看PARALLEL_MIN_TIME_THRESHOLD参数值
如果执行时间小于该值就串行执行否则并行执行
设置自动并行度
方法
1
altersession set parallel_degree_policy=limited;
altertable paralle(degree default);
方法
2
通过语句设置并行度
并行度
10
SELECT /*+ parallel(10) */ ename, dname FROM emp e, dept d
非并行度
SELECT /*+ no_parallel */ ename, dname FROM emp e, dept d
自动并行度
SELECT /*+ parallel(auto) */ ename, dname FROM emp e, dept d
In-memory并行
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直接写到数据文件中,效率要比传统的加载方式高。