从 TPCH 测试学习性能优化技巧之 Q1

算法调参侠
• 阅读 740

一、 查询要求

Q1语句查询lineItem的一个定价总结报告。在单个表lineitem上查询某个时间段内,对已经付款的、已经运送的等各类商品进行统计,包括业务量的计费、发货、折扣、税、平均价格等信息。

Q1语句的特点是:带有分组、排序、聚集操作并存的单表查询操作。这个查询会导致表上的数据有95%到97%行被读取到。

二、 Oracle执行

Oracle编写的查询SQL语句如下:

select  /*+ parallel(n) */

         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 '1995-12-01' - interval '90' day(3)

group by

         l_returnflag,

         l_linestatus

order by

         l_returnflag,

         l_linestatus;

其中/*+ parallel(n) */ 是Oracle的并行查询语法,n就是并行数。

脚本执行时间,单位:秒

从 TPCH 测试学习性能优化技巧之 Q1

三、 SPL优化

这是一个常规的分组查询,结果集也不大,没有特殊的优化技术,使用多路游标充分利用并行即可。

编写Q1查询的SPL脚本如下:

从 TPCH 测试学习性能优化技巧之 Q1

其中A1格为设置的并行数量,后续其它例子均这样约定。

这段代码较为常规,A6定义多路游标利用并行,因结果集不大,在A7使用groups做小分组。

脚本执行时间,单位:秒

从 TPCH 测试学习性能优化技巧之 Q1

可以看出,SPL的并行效果很好,接近线性提速。

单线程时SPL的性能也更好,这主要是因为组表采用了压缩列式存储。

本查询涉及数据量较大,需要从外存读入数据,硬盘访问时间是不可忽略的因素。当计算未涉及全部数据列时,使用列式存储能减少读取量。而且,列存方式更容易压缩,从而进一步减少硬盘访问时间。

事实上,集算器SPL目前采用Java开发,如果单纯对比CPU的计算性能,应当会弱于C++开发的Oracle。但是,因为压缩列式存储减少了硬盘访问时间,这导致了慢速的Java也能跑过快速的C++。

不过,列存并非总是有效,如果采用机械硬盘,列式存储会导致更多的寻道时间,虽然读取量变少,但由于寻道导致的时间消耗很可能更多。而这次测试采用了SSD硬盘,没有寻道时间的问题。

还需要值得注意的是,我们把过滤条件写进了A6,也就是游标建立的语句中。这样,SPL在读取数据时,如果发现条件不成立,将直接放弃读取相关列,进一步减少硬盘访问和记录生成的时间。

四、 进一步优化

这个SQL是单表分组统计,没有关联,有过滤。lineitem这张表数据量很大,读数耗时很长,如果能在过滤环节大幅度减少读数的消耗,可以进一步提升性能。在业务许可时,如果设计组表时改用过滤字段l_shipdate作为维字段,则可以快速选出目标数据,提升查询速度。

重新生成组表(此组表仅用于Q1查询)的SPL脚本如下:

从 TPCH 测试学习性能优化技巧之 Q1

用此组表测试,查询时间对比如下:

脚本执行时间,单位:秒

从 TPCH 测试学习性能优化技巧之 Q1

创建组表时不一定总按主键排序,如果事先知道查询条件或者这个查询条件很常用,则可以用查询字段排序来提高性能。在使用中可以采取主键排序的组表和查询字段排序的组表共存的策略,编写某个查询任务时可根据需要灵活选用某个组表。

点赞
收藏
评论区
推荐文章
Easter79 Easter79
4年前
sql优化之大数据量分页查询(mysql)
当需要从数据库查询的表有上万条记录的时候,一次性查询所有结果会变得很慢,特别是随着数据量的增加特别明显,这时就需要使用分页查询。对于数据库分页查询,也有很多种方法和优化的点。谈优化前的准备工作为了对下面列举的一些优化进行测试,需要使用已有的一张表作为实际例子。表名:order\_history。描述:某个业务的订单历史表。主要字段
Stella981 Stella981
4年前
BeetlSql 单表操作工具(Query)使用说明
BeetlSql单表查询工具(Query)使用说明在实际应用场景中大部分时候是在针对单表进行操作,单独的写一条单表操作的SQL较为繁琐,为了能进行高效、快捷、优雅的进行单表操作,Query查询器诞生了。Query使用方式和风格介绍我们以一个User表为例,查询
Wesley13 Wesley13
4年前
MySQL基础学习笔记——数据库优化(2):SQL查询优化
数据库优化SQL查询优化1.避免全表扫描,应该考虑在where及orderby涉及的列上建立索引;2.查询时使用select明确指明所要查询的字段,避免使用select(keys,flushdb等)的操作;3.SQL语句尽量大写,
Wesley13 Wesley13
4年前
MySQL学习(十二)
视图view在查询中,我们经常把查询结果当成临时表来看,view是什么?view可以看成一张虚拟表,是表通过某种运算得到的一个投影。表的变化会影响到视图既然视图只是表的某种查询的投影,所以主要步骤在于查询上,查询的结果命名为视图就可以了。创建视图的语法CREATEVIEW视图ASSELECT语句;mysqlcreate
Stella981 Stella981
4年前
Explain(MySQL高级知识四)
前言:explain(执行计划),使用explain关键字可以模拟优化器执行sql查询语句,从而知道MySQL是如何处理sql语句。explain主要用于分析查询语句或表结构的性能瓶颈。注:本系列随笔如无特殊说明都MySQL版本都为5.7.22。1.explain的作用通过explainsql语句可以知道如下内容:①表的读取顺序。(
Wesley13 Wesley13
4年前
Mysql占用过高CPU时的优化手段
慢查询日志,将那些执行时间过长且占用资源过多的SQL拿来进行explain分析,导致CPU过高,多数是GroupBy、OrderBy排序问题所导致,然后慢慢进行优化改进。比如优化insert语句、优化groupby语句、优化orderby语句、优化join语句等等;3)考虑定时优化文件及索引;4)定期分析表,使用optimizetable;
Wesley13 Wesley13
4年前
mysql中的分区表
分区表的意义:当数据量非常大时(表的容量到达GB或者是TB),如果仍然采用索引的方式来优化查询,由于索引本生的消耗以及大量的索引碎片的产生,查询的过程会导致大量的随机I/O的产生,在这种场景下除非可以很好的利用覆盖索引,否则由于在查询的过程中需要根据索引回数据表查询,会导致性能受到很大的影响,这时可以考虑通过分区表的策略来提高查询的性能。
Wesley13 Wesley13
4年前
Mysql索引最佳实践笔记0524
mysql5.7innodb默认存储引擎一、关于索引二、最佳实践三、避坑实践一、关于索引1.索引的作用提高查询效率数据分组、排序避免回表查询优化聚集查询用于多表join关联查询利用唯一性约束、保证数据唯一性innodb行锁实现索引的“
Wesley13 Wesley13
4年前
mysql出现Waiting for table metadata lock的解决方法
查询某一个表时,一直没有显示数据,于是就showprocesslist;!(https://oscimg.oschina.net/oscnet/07f86cfca979bba85837f1b6352eb00ec33.jpg)发现有表已经被锁了,关掉了之前的查询语句可以看到!(https://oscimg.oschina.net/oscn
Wesley13 Wesley13
4年前
MySQL查询优化
在我们使用MySQL数据库时,比较常用也是查询,包括基本查询,关联查询,条件查询等等,对于同一个操作,SQL语句的实现有很多种写法,但是不同的写法查询的性能可能会有很大的差异。这里主要介绍下select查询优化的要点。1\.使用慢查询日志去发现慢查询。2\.使用执行计划去判断查询是否正常运行。3\.总是去测试你的查询
京东云开发者 京东云开发者
11个月前
从MySQL JOIN 算法角度看如何优化SQL
作者:京东物流京东物流一、前言在做MySQL的SQL优化时,如果只涉及到单表查询,那么大部分慢SQL都只需从索引上入手优化即可,通过添加合适的索引来消除全表扫描或者排序操作,执行效果,大概率能实现质的飞跃。然而,在实际生产中,除了单表查询,更多的是多个表的
算法调参侠
算法调参侠
Lv1
雁啼红叶天,人醉黄花地,芭蕉雨声秋梦里。
文章
4
粉丝
0
获赞
0