从 TPCH 测试看 SPL 性能优化技巧 1

测试环境说明

CPU:4颗,主频2.6G,每一个CPU内核数8个。oracle

硬盘:800G,15000转SAS硬盘,理论读写速度150m/s。函数

内存:64G。性能

操做系统:Linux cent os 6测试

SQL1

select   
   
          l_returnflag,   
   
          l_linestatus,   
   
          sum(l_quantity) as sum_qty,   
   
          sum(l_extendedprice) as sum_base_price,   
   
          sum(l_extendedprice * (1 - l_discount)) as sum_disc_price,   
   
          sum(l_extendedprice * (1 - l_discount) * (1 + l_tax)) as sum_charge,   
   
          avg(l_quantity) as avg_qty,   
   
          avg(l_extendedprice) as avg_price,   
   
          avg(l_discount) as avg_disc,   
   
          count(*) as count_order   
   
 from   
   
          lineitem   
   
 where   
   
          l_shipdate <= date '1998-12-01' - interval '90' day(3)   
   
 group by   
   
          l_returnflag,   
   
          l_linestatus   
   
 order by   
   
          l_returnflag,   
   
          l_linestatus;

LineItem表原始数据大小为79.6G(文本格式),数据行数600037902。大数据

Oracle空间文件大小为200G,lineItem表数据导入时间20个小时。spa

SQL运行时间为637秒。操作系统

在SQL里增长并行选项select /+ parallel(lineitem 10) /后,运行时间降低到397秒。线程

用集文件执行

         集文件为集算器支持的数据文件格式。特色是对数据进行必定的压缩,以提升查找和计算的磁盘性能。code

         集文件结构简单,应用范围明确,其生成速度远远高于oracle的数据导入速度。lineitem数据导入仅需48分28秒,最终生成的集文件大小为56.9G。排序

         用集文件改写上面SQL的SPL脚本以下:

image.png

上例运行时间为412秒,比SQL少了225秒。

groups和groupx的选用

         在集算器中分组统计函数有两个,一个是groups,另外一个是groupx。

         在上例中已经介绍了groups的脚本。groupx脚本以下:

image.png

本例中该脚本的运行时间为418秒,与groups至关。

         groups与groupx的区别在于,groups全内存运行,支持并行运行,但当内存不足时不能利用外存,仅仅是抛出异常。groupx在内存不足时会利用外存完成计算,但不支持并行。

         选用groups仍是groupx须要预判统计计算过程当中,内存占用的大小。决定统计计算中内存占用大小的决定因素是,分组表达式可能产生的分组的个数。

         本例中L_RETURNFLAG为二值,L_LINESTATUS为枚举值,能够判断分组数很是小。所以这里采用groups是合适的(groups经过并行能够大幅提升执行效率,后面会介绍)。

关于游标使用

         游标原意是为了减小内存消耗,保证大数据处理能力。但有时也能用于提升性能,缘由在于减小内存使用后能减小磁盘换页机会,同时小内存块更容易分配出来、分配速度更快。

         本例中因数据量大,必须使用游标。咱们在笔记本上用1G的数据量进行过测试。当采用非游标运行的时候,内存占用达到了2380.2M,运行时间为100秒。而采用游标处理后内存占用降为183.49M,运行时间降为38秒。

用并行计算提升运算速度

咱们看一下并行计算对运算效率的提高:

image.png

         这里采用的是8线程,运行时间为84秒,运算效率提高了近5倍。

         并行计算能够充分利用CPU、硬盘等计算机资源,提高运算效率效果明显。

         设置不一样的并行运算数能够取得不一样的运算效率。在实际运行中,还要受硬盘转速、CPU核数等多种条件的影响。即便相同条件下,屡次测试的结果也会有必定的波动。具体的性能指标只有屡次实测才能得出。

用组表提升计算速度

         集算器还提供了列存格式,即组表。咱们再用组表来尝试一下,先生成组表。用文本文件生成组表的SPL脚本,以下:

image.png

         组表有更好的压缩效率,最终生成的文件的大小为29.4G,其大小几乎只有集文件的一半。

组表运行脚本:

image.png

运行时间变为60秒,相对于集文件效率提升了1/3。

组表提升运行速度的缘由是:

一、采用列存方式,数据集中,须要加载的数据量更少。

二、列存使得压缩比更高,磁盘数据进一步减小。

组表排序后对性能的影响

         组表的一个好处是,可让组表存储时,针对一些经常使用数据有序,以提升性能。本脚本有个针对L_SHITDATE的条件,若是将数据按此字段排序后会提升过滤性能。下面程序是让组表针对L_SHIPDATE排序:

image.png

排序后,再次运行脚本,运行时间为44秒(8线程),明显优于未排序状况。

相关文章
相关标签/搜索