请教一个关于程序执行效率的问题
最近在做一个程序的效率化,原来的程序执行起来特别慢,差不多每次要六个小时以上。数据量大是原因之一,但是看一下源代码,发现还是可以改善的,但是按照预想的修正以后,执行的效率并没有提高,反而要比修正前还要慢十分钟左右。下面是我的修正过程,还有我的一点想法,不知道各位有什么想法。
原程序的数据处理全部使用select-endselect,因此这次修正主要是把select-endselect修改成select into 内部表, 然后再loop内部表.但是效率并没有高。数据量都是百万数量级的。以下是我的一些想法。
为了方便描述,以下数据库名用db表示,内部表名用tbl表示。
情况(1)
记述1
select * from db1.
(中间省略)
insert db2.
endselect.
记述2
select * from db1 into table tbl1.
loop at tbl1.
(中间省略)
insert db2.
endloop.
如果是上面的这种情况,从数据库表1抽数据,然后对数据库表2进行插入操作,毫无疑问应该是上面的记述2所用的方法效率更高。
情况(2)
记述3
select * from db1.
(中间省略)
update db1.
endselect.
记述4
select * from db1 into table tab1.
loop at tbl1.
(中间省略)
update db1.
endloop.
如果是上面的这种情况,从数据库表1抽数据,进行一些处理之后,还是对数据库表1进行更新,我不敢完全确定记述4的方法就一定比记述3的效率更高,因为记述3中,虽然说select-endselect可能比较费时间,但是系统会保留当前记录的index,这样更新的时候会快一些.记述4中使用内部表,抽数据可能快一些,但是更新的时候系统是不是还要再重新找到这条数据才能进行更新,会不会因此变慢呢?
我现在碰到的就是上面的情况(2),我把原来的记述3改成记述4,效率没有提高反而慢了一些.所以很迷惑。
注:上述所有的测试是在网络情况基本稳定,数据库表的索引也一样的情况下进行的,所以基本上可以排除网络的原因以及数据库表索引的影响。
|