以文本方式查看主题 - 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秒)
但是,如果增加了数据到表中,然后操作筛选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 -- 不可以 |