Foxtable(狐表)用户栏目专家坐堂 → [求助]大批量数据删除的效率问题


  共有3312人关注过本帖树形打印复制链接

主题:[求助]大批量数据删除的效率问题

帅哥哟,离线,有人找我吗?
chnfo
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2249 积分:18530 威望:0 精华:0 注册:2011/11/26 20:21:00
[求助]大批量数据删除的效率问题  发帖心情 Post By: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编辑过]

 回到顶部
帅哥,在线噢!
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:111419 积分:567171 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2018/6/2 9:11:00 [只看该作者]

测试 一下,DeleteFor确实慢不少,应该是这个方法是针对datatable的,并且有条件需要判断,如果是全删除,比如DeleteFor(""),会快一倍,同时如果去掉删除事件代码会更快。

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

 回到顶部
帅哥哟,离线,有人找我吗?
chnfo
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2249 积分:18530 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2018/6/2 9:25:00 [只看该作者]

有什么办法改进吗?因为有时候要执行一些直接的DeleteFor,并不是所有的都是在界面上操作的。

 回到顶部
帅哥,在线噢!
有点蓝
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:111419 积分:567171 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2018/6/2 9:50:00 [只看该作者]

DeleteFor效率暂时无法提升了。如果要快,直接使用sql操作吧,几万数据删除也就不到1秒的事。

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


 回到顶部
帅哥哟,离线,有人找我吗?
chnfo
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2249 积分:18530 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By: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秒,还是要快得多。

 回到顶部
帅哥,在线噢!
有点蓝
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:111419 积分:567171 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By: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
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2249 积分:18530 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2018/6/2 12:50:00 [只看该作者]

Syscmd.Row.Delete()

如何不显示提示信息?

 回到顶部
帅哥,在线噢!
有点蓝
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:111419 积分:567171 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2018/6/2 13:55:00 [只看该作者]

没办法。

 回到顶部
帅哥哟,离线,有人找我吗?
chnfo
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2249 积分:18530 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2018/6/2 15:29:00 [只看该作者]

那能不能换个变通的方式去解决这个问题?
当弹出这个窗口的时候,自动去点击那个“确定”按钮?

这样不也可以?


 回到顶部
帅哥,在线噢!
有点蓝
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:111419 积分:567171 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2018/6/2 15:54:00 [只看该作者]

不可以

 回到顶部
总数 13 1 2 下一页