以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  [求助]大批量数据删除的效率问题  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=119846)

--  作者:chnfo
--  发布时间:2018/6/1 23:05:00
--  [求助]大批量数据删除的效率问题
在做性能测试的时候,发现一个问题。
往一个表中增加4万行数据,然后随机给AID列赋值,然后删除AID列中为空的行。

增加行的效率很高,增加4万行只需要3秒多
赋值的效率也很高,约7秒,合计约10秒。

但接下来删除AID列中为空的行,耗时居然需要70秒。----这个实在难以理解
然后保存数据,用时约35秒(这个如果用大数据量保存的方法,估计可以缩短到20秒)
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:测试随机生成和删除数据.zip


但是,如果增加了数据到表中,然后操作筛选AID为空,然后全选表中的所有行,右键删除,秒速啊,非常快。



[此贴子已经被作者于2018/6/1 23:09:27编辑过]

--  作者:有点蓝
--  发布时间:2018/6/2 9:11:00
--  
测试 一下,DeleteFor确实慢不少,应该是这个方法是针对datatable的,并且有条件需要判断,如果是全删除,比如DeleteFor(""),会快一倍,同时如果去掉删除事件代码会更快。

而右键删除是针对table的,筛选后删除不需要判断了,所以快不少。估计针对table的操作应该触发的事件也少了

--  作者:chnfo
--  发布时间:2018/6/2 9:25:00
--  
有什么办法改进吗?因为有时候要执行一些直接的DeleteFor,并不是所有的都是在界面上操作的。
--  作者:有点蓝
--  发布时间:2018/6/2 9:50:00
--  
DeleteFor效率暂时无法提升了。如果要快,直接使用sql操作吧,几万数据删除也就不到1秒的事。

为什么不在新增的时候就判断,如果是空值就不新增了,还少了删除的步骤


--  作者:chnfo
--  发布时间:2018/6/2 10:44:00
--  
这个只是一个示例,是为了说明一个方法。
例如某一个月的入库数据,加载之后做了修改,一些行的数量列改为了0,那么就要在保存的时候把它们删除(当然了,这样的数据不会有太多行,不象现在的例子有那么多数据要清)。


试了一下方法
t.StopRedraw
t.filter = "AID is null"

systemready = false
for i as integer = t.rows.count - 1 to 0 step -1
t.rows(i).delete
next

systemready = true

t.filter = ""
t.ResumeRedraw

这样,效率要高一些,上面的例子,如果把这些数据清除,估计用时6秒左右,相比deletefor要用60秒,还是要快得多。

--  作者:有点蓝
--  发布时间:2018/6/2 11:15:00
--  
MainTable = t

t.StopRedraw
t.filter = "AID is null"
t.Select(0,0,t.rows.count - 1,t.Cols.count - 1)
systemready = False
Syscmd.Row.Delete()
systemready = True

t.filter = ""
t.ResumeRedraw

--  作者:chnfo
--  发布时间:2018/6/2 12:50:00
--  
Syscmd.Row.Delete()

如何不显示提示信息?

--  作者:有点蓝
--  发布时间:2018/6/2 13:55:00
--  
没办法。
--  作者:chnfo
--  发布时间:2018/6/2 15:29:00
--  
那能不能换个变通的方式去解决这个问题?
当弹出这个窗口的时候,自动去点击那个“确定”按钮?

这样不也可以?


--  作者:有点蓝
--  发布时间:2018/6/2 15:54:00
--  
不可以