一、     查询要求

Q10语句是查询每个国家在某时刻起的三个月内货运存在问题的客户和造成的损失。

Q10语句的特点是:带有分组、排序、聚集操作并存的多表连接查询操作。查询语句没有从语法上限制返回多少条元组,但是TPC-H标准规定,查询结果只返回前10行(通常依赖于应用程序实现)。

二、     Oracle执行

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

select * from (

select  /*+ parallel(n) */

c_custkey,c_name,

sum(l_extendedprice * (1 - l_discount)) as revenue,

c_acctbal,n_name,c_address,c_phone,c_comment

from

customer,orders,lineitem,nation

where

c_custkey = o_custkey

and l_orderkey = o_orderkey

and o_orderdate >= date '1993-05-01'

and o_orderdate < date '1993-05-01' + interval '3' month

and l_returnflag = 'R'

and c_nationkey = n_nationkey

group by

c_custkey,

c_name,

c_acctbal,

c_phone,

n_name,

c_address,

c_comment

order by

revenue desc

) where rownum <=10;

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

脚本执行时间,单位:秒

并行数 1 2 4 8 12
Oracle 591 399 313 237 215

三、     SPL优化

这里的orders与lineitem主子表关联优化原理与Q3中类似。

SPL脚本如下:

  A
1 =1
2 =now()
3 >date=date("1993-05-01")
4 =elapse@m(date,3)
5 =file(path+"orders.ctx").create().cursor@m(O_ORDERKEY,O_CUSTKEY,O_ORDERDATE;O_ORDERDATE>=date   && O_ORDERDATE<A4;A1)
6 =file(path+"lineitem.ctx").create().news(A5,L_ORDERKEY,L_EXTENDEDPRICE,L_DISCOUNT,L_RETURNFLAG,O_CUSTKEY,O_ORDERDATE;L_RETURNFLAG=="R")
7 =A6.groups@u(O_CUSTKEY:c_custkey;sum(L_EXTENDEDPRICE*(1-L_DISCOUNT)):revenue)
8 =A7.sort(revenue:-1).to(10).derive@o().keys@i(c_custkey)
9 =file(path+"nation.ctx").create().cursor(N_NATIONKEY,N_NAME).fetch().keys@i(N_NATIONKEY)
10 =file(path+"customer.ctx").create()
11 =A8.joinx@q(c_custkey,A10:C_CUSTKEY,C_NAME,C_ADDRESS,C_NATIONKEY,C_PHONE,C_ACCTBAL,C_COMMENT).fetch()
12 =A11.switch(C_NATIONKEY,A9:N_NATIONKEY)
13 =A12.new(c_custkey:C_CUSTKEY,C_NAME,revenue,C_ACCTBAL,C_NATIONKEY.N_NAME:N_NAME,C_ADDRESS,C_PHONE,C_COMMENT)
14 =A13.sort(revenue:-1)
15 =now()
16 =interval@s(A2,A15)

先把orders和lineitem表的连接结果集上的分组汇总运算做完,然后再基于这个结果集继续做外部相关的外键表关联运算。因为最终结果只要取10条记录,可以只针对这10条记录再做剩下的关联计算,所以不必在分组前做,否则计算量会增大。

A8中也可以使用top函数取出前10名,比sort全排序会更快,不过此时数据量已经不大,差别不太明显了。

A8算出来之后,因为customer表对C_CUSTKEY有序,用A8.cursor().joinx@q从customer表中有序匹配快速地把相关记录取出来,再去做其它join,无须遍历customer表,减少数据读取量。

脚本执行时间,单位:秒

并行数 1 2 4 8 12
Oracle 591 399 313 237 215
SPL组表 108 61 36 23 21

从 TPCH 测试学习性能优化技巧之 Q10相关推荐

  1. oracle 测试sql执行时间_从 TPCH 测试学习性能优化技巧

    一. 目标 TPCH是由TPC(Transaction Processing Performance Council)事务处理性能委员会公布的一套针对数据库决策支持能力的测试基准,通过模拟数据库中与业 ...

  2. oracle 考试技巧,从 TPCH 测试学习性能优化技巧

    一.目标 TPCH是由TPC(Transaction Processing Performance Council)事务处理性能委员会公布的一套针对数据库决策支持能力的测试基准,通过模拟数据库中与业务 ...

  3. oracle 考试技巧,从 TPCH 测试学习性能优化技巧之 Q14

    一. 查询要求 Q14语句查询获得某一个月的收入中有多大的百分比是来自促销零件.用以监视促销带来的市场反应. Q14语句的特点是:带有聚集.连接操作的简单查询. 二. Oracle执行 Oracle编 ...

  4. java性能瓶颈分析_Java性能优化技巧整理,做一个深度的程序员

    原标题:Java性能优化技巧整理,做一个深度的程序员 在我们身边是一大批的程序员,层次不一,但是放眼观,我们很容易就可以看到那些是业务型程序员,那些是有层次的程序员.注重细节,注重性能,做一个有深度的 ...

  5. [转载] Python性能优化技巧总结

    参考链接: Python代码的优化技巧 欢迎加入Python学习交流群:535993938  禁止闲聊 ! 名额有限 ! 非喜勿进 ! 选择了脚本语言就要忍受其速度,这句话在某种程度上说明了 pyth ...

  6. MySQL 性能优化技巧

    原文地址:MySQL 性能优化技巧 博客地址:www.extlight.com 一.背景 最近公司项目添加新功能,上线后发现有些功能的列表查询时间很久.原因是新功能用到旧功能的接口,而这些旧接口的 S ...

  7. mysql 优化配置 大批量数据插入_php导入大量数据到mysql性能优化技巧

    本文实例讲述了php导入大量数据到mysql性能优化技巧.分享给大家供大家参考.具体分析如下: 在mysql中我们结合php把一些文件导入到mysql中,这里就来分享一下我对15000条记录进行导入时 ...

  8. python linux 优化_Python 代码性能优化技巧

    Python 性能优化除了改进算法,选用合适的数据结构之外,还有几种关键的技术,比如将关键 python 代码部分重写成 C 扩展模块,或者选用在性能上更为优化的解释器等,这些在本文中统称为优化工具. ...

  9. python代码性能优化技巧

    python代码性能优化技巧 代码优化能够让程序运行更快,可以提高程序的执行效率等,对于一名软件开发人员来说,如何优化代码,从哪里入手进行优化?这些都是他们十分关心的问题.本文着重讲了如何优化Pyth ...

最新文章

  1. java判断总共天数_Java判断两个日期相差天数的方法
  2. 读债务危机0806:2007到2011年泡沫蔓延
  3. [C++调试笔记]初始化
  4. python 连接oracle学习
  5. leetcode第一刷_Word Search
  6. Little endian和Big endian的区别
  7. ubuntu16.04中将自己的ubuntu做成镜像
  8. es6箭头函数_如何优雅地使用 ES6 箭头函数
  9. Grub 开启serial console支持
  10. SQL 常用脚本大全
  11. Android 开机时间优化
  12. 最长公共子串 动态规划
  13. word里面的ctrl+z快捷键无效|ctrl+z 无效 最新解决方法
  14. STM32—串口通讯详解
  15. Unity中摄像机跟随
  16. 基金从业考试的考试形式是什么?0906
  17. 9999*9999这样的命令在python中无法运行_智慧树形势与政策2018章节答案
  18. 2017百度前端技术学院习题-05
  19. clips与C++的交互
  20. 51单片机的超声波测距系统【proteus仿真+程序+报告+原理图】

热门文章

  1. 有一个函数 y={  x      x<1     |  2x-1   1<=x<10     { 3x-11  x>=10 写一段程序,输入x,输出y
  2. 【一周头条盘点】中国软件网(2018.6.18~2018.6.22)
  3. Javascript 机选双色球
  4. dump导入oracle需要提前建表吗_Oracle使用dump导入数据
  5. .NET代码质量 | 一天一点代码坏味道(4)
  6. 2017年前端面试题整理汇总100道题
  7. 尚硅谷周阳JVM快速入门
  8. 6-9 统计个位数字(15 分)
  9. Kotlin使用Room数据库
  10. Android 车载应用开发与分析 - CarLauncher