TPC-H是一个广泛使用的基准测试,用于评估数据库系统在决策支持系统(DSS)场景下的性能。

在昨天的文章中,我们完成了《Oracle 23ai TPC-H 测试环境部署》,本文将继续记录在未做任何优化场景下,这22条SQL的真实执行情况。

  • 1.修订执行有问题的SQL
  • 2.完整运行22个SQL
  • 3.测试结果统计(未做任何优化场景)

1. 修订执行有问题的SQL

因为根据《Oracle 23ai TPC-H 测试环境部署》准备好的TPC-H环境,实际测试发现有5个SQL需要微调下,否则执行会报错。

但不必担心,都是比较小的问题,不需要大改,主要是不符合Oracle 特殊的语法规则,稍加修改即可:

  • Oracle 不允许在子查询别名前使用 AS 关键字
  • Oracle 子查询的别名后面不需要也不能跟列名列表,只需要在子查询的末尾直接写上别名
  • Oracle 不支持 substring(c_phone from 1 for 2) 函数的这种语法

实际测试涉及到的具体SQL和改写方案参考:

query7.sql、query8.sql、query9.sql

  • 删除报错位置的 AS 关键字,具体位置如果找不到可以执行下,会报错具体位置,删除报错位置的 AS 关键字即可。

query13.sql

  • 删除报错位置的 AS 关键字
  • 把别名后面指定的(c_custkey,c_count)列名都去掉,列名别名c_count直接在子查询中直接指定即可。

query22.sql

  • 删除报错位置的 AS 关键字
  • substring(c_phone from 1 for 2) 改写为:substr(c_phone, 1, 2),共有三处。

其他优化(可选):

如果文件尾部有多余的where rownum语句,可以快速去掉,避免测试中不必要的错误回显:

查询最后一行情况:tail -n 1 query*.sql

我这里去掉文件最后一行:sed -i '$d' query*.sql

2. 完整运行22个SQL

我需要记录在做任何优化之前,确保完整运行过TPC-H的22个SQL查询,并记录每个查询的执行时间。

我这里使用如下脚本 query_all.sh 测试:

vi query_all.sh

for i in {1..22}; do
echo "PROMPT 当前执行第 $i 个查询;" >> commands.sql
echo "@query$i" >> commands.sql
done sqlplus -s tpch/tpch@alfred @commands.sql > output.log 2>&1

因为执行时间比较长,我这里选择放到后台执行,同时可以利用周末的时间:

nohup sh query_all.sh &

后台执行完成之后,发现这个output.log有811M大小..

嗯,有些查询返回行数实在是太多了,先不管,直接过滤下执行时间显示:

[oracle@dbtest dbgen]$ grep "Elapsed:" output.log
Elapsed: 00:06:36.20
Elapsed: 00:01:09.51
Elapsed: 00:07:43.89
Elapsed: 00:07:24.58
Elapsed: 00:08:11.85
Elapsed: 00:06:01.30
Elapsed: 00:07:39.31
Elapsed: 00:07:46.35
Elapsed: 00:10:10.19
Elapsed: 00:08:45.04
Elapsed: 00:00:56.25
Elapsed: 00:07:04.59
Elapsed: 00:02:46.57
Elapsed: 00:06:22.81
Elapsed: 00:00:00.06
Elapsed: 00:06:09.22
Elapsed: 00:00:00.38
Elapsed: 00:01:11.31
Elapsed: 00:06:20.15
Elapsed: 00:17:00.94
Elapsed: 00:07:05.97
Elapsed: 00:07:15.76
Elapsed: 00:14:26.95
Elapsed: 00:01:22.08

这有点乱。。而且咋是24个?比22个SQL要多了两个?

这里使用到一个小技巧,在匹配到关键字的行之后,额外多显示后面 1 行内容:

grep -A 1 "Elapsed:" output.log

这样显示结果就是这样,第一个Elapsed时间就是对应第1个查询,后面也都好找到一一对应了,方便判断,原来执行第 15 个查询,是存在先创建视图,再查询,再删除这个视图的逻辑,所以Elapsed会多了两个,去掉这两个时间干扰即可。

3.测试结果统计(未做任何优化场景)

这里让鲸鱼小助手帮我根据实际测试结果直接整理出表格,方便大家直观看到测试结果。

查询执行时间统计表

查询编号 执行时间 (HH:MM:SS) 执行时间 (秒) 执行快慢排名
11 00:00:56.25 56.25 1
2 00:01:09.51 69.51 2
16 00:01:11.31 71.31 3
22 00:01:22.08 82.08 4
13 00:02:46.57 166.57 5
15 00:06:09.22 369.22 6
6 00:06:01.30 361.30 7
17 00:06:20.15 380.15 8
14 00:06:22.81 382.81 9
1 00:06:36.20 396.20 10
12 00:07:04.59 424.59 11
19 00:07:05.97 425.97 12
20 00:07:15.76 435.76 13
4 00:07:24.58 444.58 14
7 00:07:39.31 459.31 15
3 00:07:43.89 463.89 16
8 00:07:46.35 466.35 17
5 00:08:11.85 491.85 18
10 00:08:45.04 525.04 19
9 00:10:10.19 610.19 20
21 00:14:26.95 866.95 21
18 00:17:00.94 1020.94 22

TOP 5 慢 SQL 执行情况

查询编号 执行时间 (HH:MM:SS) 执行时间 (秒) 执行快慢排名
18 00:17:00.94 1020.94 22
21 00:14:26.95 866.95 21
9 00:10:10.19 610.19 20
10 00:08:45.04 525.04 19
5 00:08:11.85 491.85 18

关键信息

  1. 最慢查询

    • 查询编号 18,执行时间 1020.94 秒(约 17 分钟),排名第 22。
  2. 第二慢查询
    • 查询编号 21,执行时间 866.95 秒(约 14 分 27 秒),排名第 21。
  3. 第三慢查询
    • 查询编号 9,执行时间 610.19 秒(约 10 分 10 秒),排名第 20。
  4. 第四慢查询
    • 查询编号 10,执行时间 525.04 秒(约 8 分 45 秒),排名第 19。
  5. 第五慢查询
    • 查询编号 5,执行时间 491.85 秒(约 8 分 12 秒),排名第 18。

说明

  • 执行快慢排名 是根据执行时间(秒)从小到大排序,排名越小表示查询越快,排名越大表示查询越慢。
  • 以上 TOP 5 慢 SQL 的执行时间均超过 8 分钟,其中查询编号 1821 的执行时间尤为突出,分别超过 17 分钟14 分钟
  • 这些慢 SQL 可能需要进一步优化,例如检查索引、优化查询逻辑或调整数据库配置,以提升整体性能。

在后续文章中我们将开始优化这些SQL,欢迎关注。

Oracle 23ai TPC-H 执行情况的更多相关文章

  1. 查询oracle 数据库 SQL语句执行情况

    1.查看总消耗时间最多的前10条SQL语句 select *  from (select v.sql_id,  v.child_number,  v.sql_text,  v.elapsed_time ...

  2. Oracle EBS 查看请求执行情况

    SELECT s.* FROM fnd_concurrent_requests r, v$session v, v$sql s WHERE r.oracle_session_id = v.audsid ...

  3. Oracle数据库定时任务配置和日志执行情况查询

    基础配置: /***************************************************************** * * 移动抵扣券快到期推送提醒 * 首次执行 : 2 ...

  4. Oracle EBS-SQL (PO-9):检查期间采购订单执行情况.sql

    --采购订单执行情况查询(七天内接收情况)select pha.segment1       采购订单,         msib.segment1      物料编码,         pla.qu ...

  5. [转]oracle job有定时执行的功能,可以在指定的时间点或每天的某个时间点自行执行任务。

    oracle job有定时执行的功能,可以在指定的时间点或每天的某个时间点自行执行任务. 一.查询系统中的job,可以查询视图 --相关视图 select * from dba_jobs; selec ...

  6. df -h执行卡住不动问题解决【转】

    昨天生产环境报日志写不进去了,因此 登陆线上环境后,习惯用df -h命令查看空间使用情况,结果发现该命令执行半天也没有返回. 因此使用mount命令查看该机器上的目录: [conversant@swi ...

  7. 如何在Oracle中一次执行多条sql语句 (.net C#)

    关键是不能换行,要加上begin ...sql... end;     每个SQL用:隔开,end后面必须加: 以下是拷贝于:http://www.cnblogs.com/teamleader/arc ...

  8. FreeRTOS 调试方法(printf---打印任务执行情况)

    以下转载自安富莱电子: http://forum.armfly.com/forum.php 本章节为大家介绍 FreeRTOS 的调试方法,这里的调试方法主要是教会大家如何获取任务的执行情况,通过获取 ...

  9. oracle job有定时执行功能

    oracle job有定时执行的功能,可以在指定的时间点或每天的某个时间点自行执行任务.   oracle job有定时执行的功能,可以在指定的时间点或每天的某个时间点自行执行任务. 一.查询系统中的 ...

  10. 【RTOS】基于V7开发板的最新版FreeRTOS V10.2.0程序模板,含MDK和IAR,支持串口打印任务执行情况

    模板下载: 链接:https://pan.baidu.com/s/1N32Hx7cTbDoRinuzTUB3zw   提取码:6aox 1.MDK使用MDK5.26及其以上版本. 2.IAR使用IAR ...

随机推荐

  1. 【数据库】MySQL的一些基础知识

    ALTER TABLE 表名 DROP 属性名 删除数据表 DROP TABLE 数据库名.表名; 用户管理 创建用户 CREATE USER 'username'@'host' IDENTIFIED ...

  2. Netty系列之Netty安全性

    1.1. 严峻的安全形势 1.1.1. OpenSSL Heart bleed漏洞 2014年上半年对网络安全影响最大的问题就是OpenSSL Heart bleed漏洞,来自Codenomicon和 ...

  3. 如何设置AD域用户仅登录到指定的计算机?AD域管理软件

    一 什么是AD域? 简单理解:Active Directory域内的directory database(目录数据库)是被用来存储用户账户.计算机账户.打印机和共享文件夹等对象,而提供目录服务的组件就 ...

  4. Qt音视频开发07-合并音视频文件

    一.前言 之前已经把音视频分开存储了对应的文件,因为这个需求特别少,当然确实有部分用户是需要把音视频分开存储,但是毕竟是很少数,绝大部分的用户都是音视频合并到一个MP4文件,所以如果要合并到一个文件, ...

  5. 得物自研客服IM中收发聊天消息背后的技术逻辑和思考实现

    本文由得物技术WWQ分享,原题"客服发送一条消息背后的技术和思",本文有修订和改动. 1.引言 在企业IM客服场景中,客服发送一条消息的背后,需要考虑网络通信.前端展示.后端存储以 ...

  6. Rust远程加载shellcode

    学习rust, 练习写一个loader, 不足之处还请指教 编写 隐藏黑框 在注释掉所有打印语句后编译运行还是会弹黑框, 解决方法是头部添加一行(指定 Rust 编译器生成的可执行文件为 Window ...

  7. 电信机顶盒(烽火HG680-KA)安装第三方APP

    一.前言 最近我回家休息了几天,正好赶上了暑期电视剧的更新.于是,我就在客厅里舒舒服服地坐下来,准备大饱眼福.然而,当我打开电视机准备观赏时,却发现几乎所有的电视剧都要VIP会员才能观看.于是有了以下 ...

  8. 如何快速的开发一个完整的iOS直播app(创建房间)

    直播(创建房间) 1.进入主播界面,首先创建房间 2.设计房间模型(key,名称),key作为房间的唯一标识,用来找到房间 3.用socket创建房间,导入socket.io框架 4.一般一个客户端一 ...

  9. nginx配置参数优化

    ginx作为高性能web服务器,即使不特意调整配置参数也可以处理大量的并发请求.以下的配置参数是借鉴网上的一些调优参数,仅作为参考,不见得适于你的线上业务. worker进程 worker_proce ...

  10. 【原创】thinkbook16+2023锐龙7840h版本笔记本C口充电需要重新插拔才起作用的问题自己利用延时继电器解决,笔记本两次插拔才能充电

    这个笔记本左边有两个c口都可以充电有一个是usb4,pd100w. 现在出现一个问题需要插两次才能申请到pd协议.看了主板,也没有办法直接给他dc20v的电压输入.怀念以前的笔记本都是dc供电,简单耐 ...