并行:把一个工作分成几份,分给不同进程同时进行处理。进程层面
并发:多个会话同时进行访问,就是通常所说并发数。会话层面
数据库版本
LEO1@LEO1> select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE 11.2.0.1.0 Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production
一给出一个2表关联的并行查询执行计划,并画出并行数据流图
(1)并行应用场合:
1.OLAP业务模式
首先说明一个我们经常混洗的概念OLAP和数据仓库是不是一个东西。
回答:NO
OLAP是一种业务模式,是一种批量加载批量检索的业务模式,例如在线数据分析系统。
数据仓库:是支撑这种业务模式的底层数据库。
2.系统资源相对空闲
当系统的CPU较多 IO负载不高 内存够大的时候,可以使用并行操作,需要考虑资源平衡。
3.数据符合并行特点
这个说明是什么呢,就是你所操作的数据没有串行化,可以拆分,同时对不同部分数据进行操作,
如果是那种只有计算出前者才能统计后者的流程就不适合使用并行操作了。
例如统计行数就可以使用并行,让10个进程分别统计不同区域的行数最后把结果合并起来返回给用户。
(2)首先明示一下使用并行的3种方法
1.hints 方式临时有效
select /*+ parallel(leo1 2) */ count(*) from leo1;
2.alter table对象级别定义并行直接修改对象属性长期有效
alter table leo1 parallel 4; 定义leo1表并行度为4
3.alter session force parallel 会话级别定义并行会话生命期中有效
alter session force parallel query parallel 4; 强制定义并行度为4
通常/*+ parallel(leo1 4) */
4.并行查询和并行DDL可以无障碍使用并行,如果想使用并行DML,就需要启动会话DML并行功能
alter session enable parallel dml;
(3)实验
现在我们做一个并行操作,分析一下并行执行计划流程,感性的感受一下并行的魅力
LEO1@LEO1> drop table leo1 purge; 清理环境
Table dropped.
LEO1@LEO1> drop table leo2 purge;
Table dropped.
LEO1@LEO1> create table leo1 as select * from dba_objects; 创建leo1表
Table created.
LEO1@LEO1> create table leo2 as select * from leo1; 模拟leo1创建leo2表
Table created.
LEO1@LEO1> execute dbms_stats.gather_table_stats(ownname=>'LEO1',tabname=>'LEO1',
method_opt=>'for all indexed columns size 254');
PL/SQL procedure successfully completed.
LEO1@LEO1> execute dbms_stats.gather_table_stats(ownname=>'LEO1',tabname=>'LEO2',
method_opt=>'for all indexed columns size 254');
PL/SQL procedure successfully completed.
对leo1和leo2进行全表整体分析包括数据分布情况分析(数据倾斜程度,即直方图)
Tips
如果想让n个表关联查询并且都启并行的话,hints如何写呢,请看下面
/*+ parallel(leo1,leo2,2) */对吗?当然不对
/*+ parallel(leo1 leo2,2) */对吗?当然也不对
/*+ parallel(leo1,2) parallel(leo2,2) */ 对吗? Yes 亲们要看好哦
/*+ parallel(leo1,2) parallel(leo2,2) parallel(leo3,2) ……*/ 后面同理延续
LEO1@LEO1> select/*+ parallel(leo1,2) parallel(leo2,2) */count(*) from leo1,leo2
where leo1.object_id=leo2.object_id;
Execution Plan 并行度为2执行计划
----------------------------------------------------------
Plan hash value: 2718975204
-------------------------------------------------------------------------------------------------------------------