ITPUB论坛-中国最专业的IT技术社区

 
 注册
热搜:
查看: 18651|回复: 2

[精华] introduction paralell and paralell plan

[复制链接]
论坛徽章:
12
SQL数据库编程大师
日期:2016-01-13 10:30:43SQL大赛参与纪念
日期:2016-01-13 10:32:19秀才
日期:2016-01-06 14:06:43秀才
日期:2016-01-06 14:01:09秀才
日期:2016-01-06 14:07:02ITPUB社区OCM联盟徽章
日期:2015-04-01 11:16:20举人
日期:2016-01-22 18:01:09秀才
日期:2016-01-22 17:58:00秀才
日期:2016-01-22 17:58:00秀才
日期:2016-01-22 17:58:00
跳转到指定楼层
1#
发表于 2015-8-31 13:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

PARALLEL
并行
在做查询或者DML和DDL的操作时,都可以进行并行的操作
QUERY:
Access methods:Table scans, fast full index scans、Partitioned index range scans Sorts, aggregations, and set operations、
Join methods:Nested loop, sort merge、Hash, star transformation, partitionwise JOIN

并行操作大多数的基本单位(颗粒度)是Block range granules,
即使在分区表也有很多是Block range granules,当然 也有时候是Partition granules
比如:SELECT /*+ PARALLEL(SALES,12)*/ * FROM SALES;

在分区表的时候如果过滤条件正好是分区键,那么有可能就是每一个并行进行去扫描一个或多个分区,这个时候就是partition granules
例如:SELECT /*+ PARALLEL_INDEX(c,ic,4)*/ * FROM customers c WHERE cust_city BETWEEN ‘Boston’AND ‘Orlando’;
note:如果是用Hint的话要指定表 索引和并行度

DDL:
非分区:
CREATE INDEX
CREATE TABLE… AS SELECT
ALTER INDEX… REBUILD
分区:
CREATE INDEX
CREATE TABLE… AS SELECT
ALTER TABLE… MOVE PARTITION
ALTER TABLE… SPLIT PARTITION
ALTER TABLE… COALESCE PARTITION
ALTER INDEX… REBUILD PARTITION
ALTER INDEX… SPLIT PARTITION

比如:CREATE BITMAP INDEX fk_sales_prod ON sales(prod_id) PARALLEL 16 LOCAL NOLOGGING;
DML:
INSERT
UPDATE
DELETE
MERGE
例如:
alter session enable parallel DML;
UPDATE /*+PARALLEL(sales,12)*/ sales SET amount_sold=amount_sold*6.55957;

在并行做DML的时候一定要注意的是:如果没有使用enable PARALLEL DML 这样只是在select的时候用到了并行,UPDATE的时候还是串行的(做Update是先要select到内存)
我们可以看一下执行计划

—————————————————————————————————————
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib |
—————————————————————————————————————
| 0 | UPDATE STATEMENT | | 64574 | 819K| 79 (0)| 00:00:01 | | | |
| 1 | UPDATE | T | | | | | | | |
| 2 | PX COORDINATOR | | | | | | | | |
| 3 | PX SEND QC (RANDOM)| :TQ10000 | 64574 | 819K| 79 (0)| 00:00:01 | Q1,00 | P->S | QC (RAND) |
| 4 | PX BLOCK ITERATOR | | 64574 | 819K| 79 (0)| 00:00:01 | Q1,00 | PCWC | |
| 5 | TABLE ACCESS FULL| T | 64574 | 819K| 79 (0)| 00:00:01 | Q1,00 | PCWP | |
—————————————————————————————————————

但是如果我们enable PARALLEL dml之后

SQL> update /*+parallel(t 4) */ t set object_id=object_id+1;

70876 rows updated.
Execution Plan
———————————————————-
ERROR:
ORA-12838: cannot read/modify an object after modifying it in parallel
SP2-0612: Error generating AUTOTRACE EXPLAIN REPORT
这个时候就不可以用set autotrace来看执行计划了。是因为当使用并行做操作的时候会对这个表加的锁级别为6(exclusive )(每种级别级:)
这种锁会导致当前session不提交/回滚的时候 当前session不能读的 explan plantable 也在当前事务中,所以不可以被explan出来
SQL> explain plan for update /*+parallel(t 4) */ t set object_id=object_id+1;

Explained.

SQL> select * from table(DBMS_XPLAN.DISPLAY);

PLAN_TABLE_OUTPUT
————————————————————————————————————————————————————————————————————————————————————————————————————
Plan hash value: 2037160838

—————————————————————————————————————
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib |
—————————————————————————————————————
| 0 | UPDATE STATEMENT | | 64574 | 819K| 79 (0)| 00:00:01 | | | |
| 1 | PX COORDINATOR | | | | | | | | |
| 2 | PX SEND QC (RANDOM) | :TQ10000 | 64574 | 819K| 79 (0)| 00:00:01 | Q1,00 | P->S | QC (RAND) |
| 3 | UPDATE | T | | | | | Q1,00 | PCWP | |
| 4 | PX BLOCK ITERATOR | | 64574 | 819K| 79 (0)| 00:00:01 | Q1,00 | PCWC | |
| 5 | TABLE ACCESS FULL| T | 64574 | 819K| 79 (0)| 00:00:01 | Q1,00 | PCWP | |
—————————————————————————————————————

Note
—–
– dynamic sampling used for this statement (level=2)

16 rows selected.

可以很清楚的看到把update的操作提前到了并行上,当并行读出数据后也直接并行的进行修改,而不是把并行读出的数据汇总之后再串行的修改。

ALTER SESSION ( ENABLE | DISABLE )PARALLEL DML;
所以一定要开启

在merge的时候也可以使用并行 同时为每张表都指定不同的并行度
MERGE /*+ PARALLEL(c,3) PARALLEL(d,3) */
INTO customers c
USING diff_customers d ON (d.cust_id = c.cust_id)
WHEN MATCHED THEN
UPDATE SET c.cust_last_name = d.cust_last_name,
c.cust_city = d.cust_city
WHEN NOT MATCHED THEN
INSERT (c.cust_id,c.cust_last_name) VALUES
(d.cust_id,d.cust_last_name);

什么时候适用于并行的DML呢? 在数据仓库里的大表 创建一些记录表 修改历史数据 运行批量作业的时候
当然并行的DML的缺点也是有的 比如上面的ORA-12838 也不能很好的对一些约束进行支持 在簇表上也不支持
如果有触发器的时候也是不能进行并行操作的 远端的(dblink)对象也不可以 分布式事物里也是不可以的
并行度:dop PARALLEL OF DEGREE 平行度是由一个并行操作使用并行执行服务器的数量。如果是一个P TO P 可能会用到两倍的DOP
而且是最多两倍 因为不可能超过两组被同一个并行操作使用
这个值可能不是你用Hint指定的值 它是在并行的时候自动的算出来的 取决于你的操作系统CPU个数和PARALLEL_THREADS_PER_CPU参数
两组并行进程的交互:
PARTITION
HASH
RANGE 比如创建唯一索引时
BROADCAST
ROUND ROBIN
QC(RANDOM)
QC(ORDER)

SERIAL_FROM_REMOTE (S -> R) Serial execution at a remote site
PARALLEL_FROM_SERIAL (S -> P) Serial execution: Output partitioned or broadcast to PX
PARALLEL_TO_PARALLEL (P -> P) PARALLEL execution: Output repartitioned to second set of PX
PARALLEL_TO_SERIAL (P -> S) PARALLEL execution: Output returns to coordinator

SELECT * FROM dba_users

SELECT cust_city,sum(amount_sold)
FROM sales s, customers c
WHERE s.cust_id=c.cust_id
GROUP BY cust_city;

HASH GROUP BY 620 20460 894 1165905042 0 1
HASH JOIN 7059 232947 894 1143250819 “ITEM_1″=”C”.”CUST_ID” 1 2
VIEW SYS VW_GBC_5 7059 127062 490 VW_GBC_5@SEL$0737CF93 1099574752 2 3
HASH GROUP BY 7059 70590 490 1099574752 3 4
PARTITION RANGE ALL 918843 9188430 490 260913323 4 5
TABLE ACCESS FULL SH SALES 918843 9188430 490 S@SEL$1 260913323 5 6 ANALYZED
TABLE ACCESS FULL SH CUSTOMERS 55500 832500 404 C@SEL$1 27773217 2 3 ANALYZED

SELECT /*+parallel */ cust_city,sum(amount_sold)
FROM sales s, customers c
WHERE s.cust_id=c.cust_id
GROUP BY cust_city;
SELECT * FROM v$pq_tqstat

PX COORDINATOR
PX SEND QC P->S QC(RANDOM)
HASH GROUP BY PCWP
PX RECEIVE PCWP
PX SEND P->P HASH
HASH GROUP BY PCWP
HASH JOIN PCWP
PX RECEIVE PCWP
PX SEND P->P (BROADCAST)
PX BLOCK ITERATOR PCWC
TABLE ACCESS FULL CUSTOMERS PCWP
PX BLOCK ITERATOR PCWC
TABLE ACCESS FULL SALES PCWP

并行 BLOCK ITERATOR扫描CUSTOMERS表然后P->P
一些和并行刷的初始化参数

PARALLEL_ADAPTIVE_MULTI_USER 默认是TRUE 对并行进行总的限制
PARALLEL_MAX_SERVERS默认值是CPU_COUNT x PARALLEL_THREADS_PER_CPU x (1; 2if PGA_AGGREGATE_TARGET > 0) x 5、 最多可以用的并行度
PARALLEL_EXECUTION_MESSAGE_SIZE 默认是16 KB (port specific)
Increasing 4 KB to 8 KB、32kb improves parallel performance if SGA is large enough

也可以使用V$PQ_TQSTAT这个视图查看最后一次并行操作每个并行进程操作的数据量是多少
使用V$PX_PROCESS_SYSTAT这个视图查看使用了多少内存(large POOL) 多少buffer CACHE
–V$PX_SESSION 包含了每个session的并行操作
–V$PX_PROCESS 包含了每个session的并行操作使用了多少资源
–V$PX_PROCESS_SYSSTAT 包含了每个并行的进程当前的状态
–V$PX_SESSTAT
–V$PQ_SESSTAT
–V$PX_BUFFER_ADVICE

V$SYSSTAT:
SELECT name, value
FROM V$SYSSTAT
WHERE UPPER(name) LIKE ‘%PARALLEL OPERATIONS%’
OR UPPER(name) LIKE ‘%PARALLELIZED%’

OR UPPER(name) LIKE ‘%PX%’;
论坛徽章:
15
秀才
日期:2015-09-21 09:46:16双子座
日期:2016-01-15 10:47:09秀才
日期:2016-01-13 12:14:26秀才
日期:2015-12-25 15:31:10双子座
日期:2015-12-15 09:58:52巨蟹座
日期:2015-11-17 17:17:02白羊座
日期:2015-11-09 13:49:13双子座
日期:2015-11-02 10:25:11水瓶座
日期:2015-08-25 15:30:042015年新春福章
日期:2015-03-06 11:57:31
2#
发表于 2015-9-15 17:06 | 只看该作者
mark一下,明天做几个实验

使用道具 举报

回复
论坛徽章:
2
ITPUB15周年纪念
日期:2017-05-08 10:50:44罗罗诺亚·索隆
日期:2017-05-23 13:28:33
3#
发表于 2017-5-21 01:06 | 只看该作者
马克 紫薯布丁

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档 |
  | | |
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 网站律师 隐私政策 知识产权声明
 北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表