Parallel execution 并行查询的性能测试(2)
来源:互联网 发布:淘宝助理尺码表制作 编辑:程序博客网 时间:2024/05/22 03:39
多块硬盘
因为单块硬盘使用多线程没有效果,io成为了瓶颈。这里使用了移动硬盘来分离io的压力(通常生产系统上面都是使用条带的,数据可以平均的分布到多块磁盘上,这个时候多线程能够更好的发挥其作用)。
与以上的情况有所不同,这里使用hash partition技术来平均分布每个硬盘上的数据。
相关sql:
- sys@ORCL> create tablespace zdry_tbs2
- 2 datafile 'F:\oradat\zdry_tbs2.dbf' size 2g
- 3 autoextend on next 1g maxsize 31g ;
- sys@ORCL> alter user zdrygk quota unlimitedon zdry_tbs2;
- User altered.
- CREATE TABLE sfxx2
- PARTITION BY HASH(sfzh)
- (PARTITION p1 TABLESPACE users, PARTITION p2tablespace zdry_tbs2) as
- select * from qbtb_zdry_sfxx where 1=2
- /
- zdrygk@ORCL> insert into /*+ append */sfxx2select * from qbtb_zdry_sfxx ;
- 3022273 rows created.
- zdrygk@ORCL> commit;
- Commit complete.
查询测试
相关查询SQL:
- select /*+ no_parallel */ count(*) from sfxx2 t;
- select /*+ parallel(t 2) */ count(*) from sfxx2t;
- select /*+ parallel(t 4) */ count(*) from sfxx2t;
- select /*+ parallel(t 8) */ count(*) from sfxx2t;
具体执行计划以及10046跟踪文件可以看附录2
分析:
如上图所示,顺序执行所消耗的时间最高。性能最高的是并行度为2的时候,因为数据只分布在2块硬盘上,所以它的效率最高。依照原理应该是并行度2以上的执行效率应该越来越低才对,但是DOP8的反而比DOP4要高,可能是因为当时cpu比较忙或者硬盘在执行其他的IO所导致,所以执行了下面的测试。每个查询执行10次,比较平均消耗的时间。
- create or replace procedure parallel_test1(sql_in in varchar2,numbers_in in number) is
- n_ number;
- stat_1number ;
- stat_2number ;
- begin
- stat_1:= dbms_utility.get_time ;
- for iin 1 .. numbers_in loop
- execute immediate sql_in into n_ ;
- endloop ;
- stat_2:= dbms_utility.get_time ;
- dbms_output.put_line('Total Elapsed : ' || (stat_2-stat_1)/100) ;
- dbms_output.put_line('Avg Elapsed : ' || (stat_2-stat_1)/100/numbers_in) ;
- end ;
- SQL> exec parallel_test1('select /*+no_parallel */ count(*) from sfxx2 t',10) ;
- Total Elapsed : 243.41
- Avg Elapsed : 24.341
- PL/SQL procedure successfully completed
- SQL>
- SQL> exec parallel_test1('select /*+parallel(t 2) */ count(*) from sfxx2 t',10) ;
- Total Elapsed : 131.02
- Avg Elapsed : 13.102
- PL/SQL procedure successfully completed
- SQL> exec parallel_test1('select /*+parallel(t 4) */ count(*) from sfxx2 t',10) ;
- Total Elapsed : 144.88
- Avg Elapsed : 14.488
- PL/SQL procedure successfully completed
- SQL> exec parallel_test1('select /*+parallel(t 8) */ count(*) from sfxx2 t',10) ;
- Total Elapsed : 155.7
- Avg Elapsed : 15.57
- PL/SQL procedure successfully completed
正如上面所料。
您是否还有疑惑,是否使用hash partition 在单块磁盘下使用多线程也会有性能提升呢?恭喜你,你的思维已经沦落到与我保持同步了,请看附录4。
完整文档(包括附录)打包下载:
http://download.csdn.net/detail/renfengjun/4962702
附录
附录1 单块磁盘下的查询计划
附录2 多块磁盘下的查询计划
附录3 完整的多线程trace 统计
附录4 单磁盘hash partition + parallel execution
参考文档
Oracle®PerformanceSurvival Guide chapter 13 parallel sql:
http://download.csdn.net/detail/onlinedog/1798602
VLDB andPartitioning Guide chapter 8 Using Parallel Excution:
http://docs.oracle.com/cd/E11882_01/server.112/e25523/parallel.htm#i1009828
DavidDai,Oracle 11g 中 Direct path reads 特性说明:
http://blog.csdn.net/tianlesoftware/article/details/7690369
- Parallel execution 并行查询的性能测试
- Parallel execution 并行查询的性能测试(2)
- Parallel execution 并行查询的性能测试(1)
- Parallel Execution(并行执行)
- C#并行计算类Parallel的性能测试
- Oracle Parallel Execution(并行执行)
- Oracle Parallel Execution(并行执行)
- Oracle Parallel Execution(并行执行) .
- Oracle Parallel Execution(并行执行)
- Oracle Parallel Execution(并行执行)
- Oracle Parallel Execution(并行执行)
- Oracle Parallel Execution(并行执行)
- Oracle Parallel Execution(并行执行)
- Oracle Parallel Execution(并行执行)
- Oracle Parallel Execution(并行执行)
- C#并行运算 Parallel.Invoke、Parallel.For、Parallel.Foreach性能测试及示例
- Parallel SQL Execution并行SQL执行
- Oracle 并行执行( Parallel Execution)原理初探
- Storm框架使用详解 搭建篇
- cumsum cumprod prod函数的用法
- Yii快速入门教程14
- C++初始化列表问题,类中有一个对象类型的数组成员变量,在初始化列表中初始化时报错“[]”操作符语法错误
- Oracle的一些记录
- Parallel execution 并行查询的性能测试(2)
- C#压缩打包文件
- yii快速入门教程15
- 忘记烦恼吧
- WEB程序员需要掌握的十大MySQL优化技巧
- C#冒泡排序
- android Fragment demo学习
- 根据两点间的经纬度计算距离
- 成都理工大学计算机与网络科技协会CSDN高校俱乐部成立仪式成功举行