急啊!为什么同样的查询条件,主表和逻辑表的速度差那么多啊!

发布于 2022-10-15 07:42:15 字数 576 浏览 35 评论 0

我们系统上有1个表TB1,它有8个逻辑文件(分别命名为TB1L01, TB1L02,..., TB1L08 ),这个表目前大约是400W的数据量。
主表的关键字是CLIENTID, TB1L08的关键字是DJRQ(登记日期),整个表大约有80个字段,DJRQ在主表中的位置是大约第10个字段

我用STRSQL进行数据查询:
SELECT * FROM TB1 WHERE DJRQ>=20110501 AND DJRQ<=20110506,速度比较快,大约1秒钟就出来了
如果我用:
SELECT * FROM TB1L08 WHERE DJRQ>=20110501 AND DJRQ<=20110506,速度很慢,查了将近1分45秒

关键是20110501后,其实数据库中根本就没有记录的。查询有记录的数据也是同样慢。

我觉得这是有点无法理解!同样的2张表,按照TB1L08的关键字查,反而比主表慢,这是什么原因啊!

我的程序中,OPNQRYF连接以上条件,虽然我指定TB1,但是我感觉它默认使用了TB1L08,因为运行速度非常慢!

这要如何解决?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

呆头 2022-10-22 07:42:15

求各位指点

猫腻 2022-10-22 07:42:15

组织啊,帮帮我吧~~~

回眸一笑 2022-10-22 07:42:15

找个时间对TB1执行RGZPFM数据清理,提高读写和查询效率.
另外,"我的程序中,OPNQRYF连接以上条件,虽然我指定TB1,但是我感觉它默认使用了TB1L08,因为运行速度非常慢!这要如何解决?",你重新debug跟踪下你的程序,看是否如此.

没企图 2022-10-22 07:42:15

本帖最后由 tomroom 于 2011-05-06 22:55 编辑

楼主导致这样情况 很多, 表若有大量频繁删除insert操作 强烈推荐轻舟大哥前面建议停系统做整理 提高访问速度。 你试试 该下你的语句 如下 你跑下试试 情况如何? 我看过IBM DB2 SQL优化文章里面 下面语句 更推荐, 如果你TB1L08 里KEY 就只是 是 DJRQ 下。你试下

SELECT * FROM TB1L08 WHERE DJRQ BETWEEN (20110501  20110506)

请教这个表和系统 是那个国内那个公司开发的

梦幻的心爱 2022-10-22 07:42:15

猜测逻辑文件用了 select 或者 omit的键字。并且DYNSLT也起作用了。

泡沫很甜 2022-10-22 07:42:15

回复 1# greatmj001

首先,OS400是一个非常特殊的操作系统,即数据库操作系统。在OS400下,DB2/400是OS400的基础,几乎所有的OS操作都是建立在DB2/400上。顺便说一下,DB2/400的版本与OS400版本一致。

在OS400下,DB2/400有两个数据驱动:1)CQE,传统的(RPG)查询驱动;2)SQE,SQL 查询驱动。IBM的硬件驱动在这两个驱动之间有一个优化选择器,是微码级的操作。在OS400下,RPG用F表指定进行操作,优化器就选择CQE驱动。上面的例子数据中,如果采用TB1L08 LF文件用RPG操作,速度决定是最快的。楼主说的,如果sql语句采用表(PF)TB1进性操作,因为TB1表下已经存在满足where条件的index数据集,即TB1L08,优化器会自动采用这个索引集,即sqe查询系统自动采用cqe的索引集,速度的延时组要是sqe转向cqe索引,因为优化器是微码级的操作,速度影响,IBM基本做到最快速度操作。

楼主的采用TB1L08文件,即CQE的索引文件在SQE下进行操作,这类的转向操作所花费的时间,比sqe直接操作,优化器采用存在的cqe索引集的速度肯定比较花费时间多。在较高版本的os400对sqe的支持力度几乎都是微码级的操作,在v5r2之前,都是os400进行转换操作,而不是微码级操作,会影响执行效率。顺便说一下,v5r4下,os400才完善主要的sql操作的微码级操作。但是os400仍然保留转换操作,如果没有满足os400下的sql微码操作的条件,os400仍然采用转换操作,就像楼主的测试数据放映一样,执行速度无法与微码操作速度相比。

农村范ル 2022-10-22 07:42:15

本帖最后由 passthru 于 2011-05-07 14:12 编辑

我在想,用“SELECT * FROM TB1L08 WHERE DJRQ>=20110501 AND DJRQ<=20110506,速度很慢,查了将近1分45秒”,是不是在执行期间,在TB1下创建一个满足TB1L08索引条件的index。如果可以测试,如果创建这个index的时间上限接近1分45秒,这种说法就非常有可能存在。

如果““SELECT * FROM TB1L08 WHERE DJRQ>=20110501 AND DJRQ<=20110506”测试重复几十次,执行速度接近1秒,就肯定上面的假设是存在的。

楼主有兴趣,如果做完这个测试,请把结果贴出来,完善这个帖子内容。

方圜几里 2022-10-22 07:42:15

猜测逻辑文件用了 select 或者 omit的键字。并且DYNSLT也起作用了。
osky555 发表于 2011-05-07 01:13

楼主 把你表的layout 都贴上吧,详细些

黄昏下泛黄的笔记 2022-10-22 07:42:15

逻辑文件,数据量多了,先按key进行索引排序,拿一定是慢啊!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文