一、 目标

TPCH是由TPC(Transaction Processing Performance Council)事务处理性能委员会公布的一套针对数据库决策支持能力的测试基准,通过模拟数据库中与业务相关的复杂查询考察数据库的综合处理能力,获取数据库操作的响应时间。

TPCH基准模型中定义了一个数据库模型,容量可以在1GB~10000GB的8个级别中进行选择。数据库模型包括CUSTOMER、LINEITEM、NATION、ORDERS、PART、PARTSUPP、REGION和SUPPLIER 共8张数据表,以及22条SQL查询语句,涉及内容广泛丰富,可以较完整地测试数据库的运算性能。

TPCH的SQL中不乏一些多层嵌套的复杂查询,执行性能较差。对于这些查询,如果能采用更合理的存储方案,设计低复杂度算法并配合并行等手段,将获得更优的性能。但遗憾的是,由于理论体系的限制,很多想法无法用SQL实现,而SQL程序员也因此不关注这些性能优化方法,经常只能忍受数据库的低速运算。

本系列文章将通过这8张表及22条SQL讨论数据运算时的性能优化技巧,仔细分析每一条语句,发现其运算和数据特征,设计更合理的算法加以实现。由于SQL难以实现这些算法和存储结构,我们将使用集算器组表来存储数据,并用SPL实现这些算法,同时与Oracle上的SQL对比性能。希望读者能够通过这些内容学会各种情况下适用的高性能计算技术。

二、 环境

CPU:2颗Intel3014,主频1.7G,每个CPU内核数6个。

硬盘(SSD):1T 561MB/s(读) 523MB/s(写) 接口:SATA 6.0Gb/s

内存:64G。

操作系统:Linux CentOS 7

三、 数据准备

为了回避硬盘读取数据能力的差异,我们将Oracle数据表的数据和SPL组表文件均存储在同一块SSD固态硬盘上。

1. TPCH原始数据生成

利用TPCH官方工具生成8张表的原始数据,数据量总规模100G,各文件大小见后表。

2. 数据导入Oracle

数据导入Oracle比较简单,在Oracle数据库中创建一个数据库名为tpch,运行TPCH工具生成的dss.ddl和dss.ri文件来创建8张数据表以及表的主键、外键关系。然后运行ctl文件将原始数据分别导入各表中。例如导入lineitem表数据的ctl文件如下:

LOAD DATA INFILE '/home/tpch_2_17_0/tbls/lineitem.tbl'

INTO TABLE LINEITEM

(L_ORDERKEY terminated by '|',

L_PARTKEY terminated by '|',

L_SUPPKEY terminated by '|',

L_LINENUMBER terminated by '|',

L_QUANTITY terminated by '|',

L_EXTENDEDPRICE terminated by '|',

L_DISCOUNT terminated by '|',

L_TAX terminated by '|',

L_RETURNFLAG terminated by '|',

L_LINESTATUS terminated by '|',

L_SHIPDATE date "yyyy-mm-dd" terminated by '|',

L_COMMITDATE date "yyyy-mm-dd" terminated by '|',

L_RECEIPTDATE date "yyyy-mm-dd" terminated by '|',

L_SHIPINSTRUCT terminated by '|',

L_SHIPMODE terminated by '|',

L_COMMENT terminated by '|')

将此脚本存成lineitem.ctl文件,然后在linux命令行执行:

sqlldr 数据库用户名/用户密码@tpch control="/home/sjr/oracle/ctl/lineitem.ctl"

即可,最后可在日志里查看导入数据执行时间。其它数据表的数据导入与此类似,不再赘述。

3.生成SPL组表

SPL组表也由原始数据文件tbl来生成,每张表生成一个组表文件,用表的主键作为组表的维。对于数据量较大的表需要使用sortx函数对主键排序,关于sortx函数使用的jvm配置请看《JVM 参数调整对 sortx 的影响》。

运行SPL脚本生成所需要的组表,下文介绍生成各组表的SPL脚本。

3.1 region/nation/customer/supplier/part/orders 表

以region表为例:

用文本文件创建游标取数并按主键排序后再写入组表,注意组表创建时要指名主键字段(前面加#),排序时的第二个参数可根据内存大小来确定,省略不写也能工作。

其它各表类似,只要改文件名、排序的主键名及数据结构信息即可,不再赘述。

3.2 partsupp/lineitem 表

partsupp和lineitem分别是part和orders的子表,对于主子表的存储,组表有特殊的要求,以lineitem表为例说明。

lineitem表的主键是L_ORDERKEY和L_LINENUMBER,L_ORDERKEY与orders表中的O_ORDERKEY相对应,L_LINENUMBER是orders表中某一个订单的明细项编号,这样的表数据结构称为主子表。

注意这里A2在创建组表时和前面不同,后面多了一个参数,表明该组表将会按L_ORDREKEY分段,不会将L_ORDERKEY字段值相同的记录分到两段去,才能保证正确的并行计算结果,我们会在后面的例子中看到这种存储方案的效果。

类似地,partsupp可以看作part表的子表,则生成组表的代码是这样:

四、 数据准备时间及文件大小

数据导入Oracle与产生组表的时间对比见下表,只比较数据量最大的lineitem、orders及partsupp三张表。

原始文件大小、SPL组表文件大小见下表。

Oracle表数据都是存在库文件里,没有单独的表文件。但是导入数据后的库文件比原始数据的总和要大,可以推断每个表所占的硬盘空间要比原始数据文件大。

TPCH原始数据导入Oracle库表的时间,要比导入到SPL组表的时间多5倍以上(即使加上了排序时间);而且所占硬盘空间也比组表要大一倍多(组表有压缩,有序后更容易压缩)。所以,为了获得更好的查询性能而换用组表来存储数据,是非常值得的,既省时又省空间,数据准备工作变得更快速。

五、 TPCH 测试详细解析

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

oracle 测试sql执行时间_从 TPCH 测试学习性能优化技巧相关推荐

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

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

  2. oracle 测试sql执行时间_通过错误的SQL来测试推理SQL的解析过程

    这是学习笔记的第 1977 篇文章 如果抛出一个问题,你是如何理解MySQL解析器的,它和Oracle解析器有什么差别?相信大多数同学都会比较迷茫,因为这个问题很难验证,要不是看源码,要不就是查看书上 ...

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

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

  4. 从 TPCH 测试学习性能优化技巧之 Q10

    一.     查询要求 Q10语句是查询每个国家在某时刻起的三个月内货运存在问题的客户和造成的损失. Q10语句的特点是:带有分组.排序.聚集操作并存的多表连接查询操作.查询语句没有从语法上限制返回多 ...

  5. ORACLE 查询SQL执行时间

    ORACLE 查询SQL执行时间: SELECT C.sample_time 执行时间, A.ELAPSED_TIME_DELTA / 1000000 "执行耗时(S)", B.s ...

  6. oracle 查询 sql 执行时间设置,ORACLE 查询SQL执行时间

    ORACLE 查询SQL执行时间: SELECT C.sample_time 执行时间, A.ELAPSED_TIME_DELTA / 1000000 "执行耗时(S)", B.s ...

  7. SQL性能优化技巧,常见优化10经验,数据库查询好慢,还能怎么办

    我熟练应用ctrl c和ctrl v 开发curd代码好多年了. mysql查询为什么会慢,关于这个问题,在实际开发经常会遇到,而面试中,也是个高频题. 遇到这种问题,我们一般也会想到是因为索引. 那 ...

  8. SQL Server 2005 Compact Edition 程序设计与性能优化

    这是马宁在MEDC 2007上讲授的EAA 402课程,是我收获最多的一节课.马老师已经提供了该课程的PPT和Sample Code给大家下载! 本次课程讲述SQL Server 2005 Mobil ...

  9. Sql Server RowNumber和表变量分页性能优化小计

    直接让代码了,对比看看就了解了 当然,这种情况比较适合提取字段较多的情况,要酌情而定 性能较差的: WITH #temp AS ( Select column1,column2,column3,col ...

最新文章

  1. Apache+Tomcat +mod_proxy集群负载均衡及session
  2. Java 调用 Oracle 存储过程返回结果集
  3. centOS上安装redis
  4. Java集成PageOffice在线打开编辑word文件 - Spring Boot
  5. android源码下载与编译,Android源码下载并编译
  6. java 国际化 properties_java Properties 读取文件,国际化
  7. python基础七之copy
  8. centos7系统卸载Visual Studio Code
  9. 外星网络大肆入侵,地球人能安好吗?
  10. iis php7页面空白,iis 无法显示htm页面问题解决
  11. python 实现SOM: 函数更新
  12. 华章教育pdf计算机,AB-PLC华章培训全集.pdf
  13. 打通法律服务群众“最后一公里”,方正璞华劳动人事法律自助咨询服务平台频获“点赞”
  14. 求1加到n的发散思维方法
  15. 前后端分离实现上传图片的功能
  16. Asp 操作Access数据库时出现死锁.ldb的解决方法
  17. 安装python的时候遇到的问题,无法安装bz2modules等
  18. android 手机震动1次,Android的手机震动
  19. 读标准03-IEEE1451.5标准协议尝鲜实现
  20. 徐松亮的杂谈随笔(随时更新)

热门文章

  1. 服务器端事件发送SSE
  2. redis的数据持久化方案
  3. 使用Nexus搭建Maven仓库私服的权限配置心得
  4. 【App 支付】交易查询接口
  5. Redis学习笔记(3)-XShell连接CentOSMini,并安装Redis
  6. 代码文档生成工具-Doxygen生成CHM和RTF图文教程
  7. 简单脚本之显示系统当前的一些信息
  8. 读取文本中的数用英文转换过来
  9. Gnumeric,专业处理数字软件
  10. JavaScript 中的函数式编程实践