急啊!为什么同样的查询条件,主表和逻辑表的速度差那么多啊!
我们系统上有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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
求各位指点
组织啊,帮帮我吧~~~
找个时间对TB1执行RGZPFM数据清理,提高读写和查询效率.
另外,"我的程序中,OPNQRYF连接以上条件,虽然我指定TB1,但是我感觉它默认使用了TB1L08,因为运行速度非常慢!这要如何解决?",你重新debug跟踪下你的程序,看是否如此.
本帖最后由 tomroom 于 2011-05-06 22:55 编辑
楼主导致这样情况 很多, 表若有大量频繁删除insert操作 强烈推荐轻舟大哥前面建议停系统做整理 提高访问速度。 你试试 该下你的语句 如下 你跑下试试 情况如何? 我看过IBM DB2 SQL优化文章里面 下面语句 更推荐, 如果你TB1L08 里KEY 就只是 是 DJRQ 下。你试下
SELECT * FROM TB1L08 WHERE DJRQ BETWEEN (20110501 20110506)
请教这个表和系统 是那个国内那个公司开发的
猜测逻辑文件用了 select 或者 omit的键字。并且DYNSLT也起作用了。
回复 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仍然采用转换操作,就像楼主的测试数据放映一样,执行速度无法与微码操作速度相比。
本帖最后由 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秒,就肯定上面的假设是存在的。
楼主有兴趣,如果做完这个测试,请把结果贴出来,完善这个帖子内容。
楼主 把你表的layout 都贴上吧,详细些
逻辑文件,数据量多了,先按key进行索引排序,拿一定是慢啊!