任俊慧 发表于 2025-6-4 21:56:18

Oracle 23ai TPC-H 修订问题SQL

TPC-H是一个广泛使用的基准测试,用于评估数据库系统在决策支持系统(DSS)场景下的性能。
在之前的文章中,我们完成了《Oracle 23ai TPC-H 测试环境部署》,本文修订下有问题的SQL,确保22条SQL可以正常运行。

[*]1.修订执行有问题的SQL
[*]2.完整运行22个SQL
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大小..
嗯,有些查询返回行数实在是太多了,先不管,直接过滤下执行时间显示:
$ grep "Elapsed:" output.log这有点乱。。而且咋是24个?比22个SQL要多了两个?
这里使用到一个小技巧,在匹配到关键字的行之后,额外多显示后面 1 行内容:
grep -A 1 "Elapsed:" output.log这样显示结果就是这样,第一个Elapsed时间就是对应第1个查询,后面也都好找到一一对应了,方便判断,原来执行第 15 个查询,是存在先创建视图,再查询,再删除这个视图的逻辑,所以Elapsed会多了两个,去掉这两个时间干扰即可。
SQL执行时间除了必要的优化之外,还和你的硬件能力息息相关,所以这里就不放具体的执行时间了。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: Oracle 23ai TPC-H 修订问题SQL