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


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

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

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


加好友 发短信
等级:九尾狐 帖子:2239 积分:18446 威望: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编辑过]

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


加好友 发短信
等级:九尾狐 帖子:2239 积分:18446 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2018/6/2 9:25:00 [显示全部帖子]

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

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


加好友 发短信
等级:九尾狐 帖子:2239 积分:18446 威望: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秒,还是要快得多。

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


加好友 发短信
等级:九尾狐 帖子:2239 积分:18446 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2018/6/2 12:50:00 [显示全部帖子]

Syscmd.Row.Delete()

如何不显示提示信息?

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


加好友 发短信
等级:九尾狐 帖子:2239 积分:18446 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2018/6/2 15:29:00 [显示全部帖子]

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

这样不也可以?


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


加好友 发短信
等级:九尾狐 帖子:2239 积分:18446 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2018/6/4 11:39:00 [显示全部帖子]

还有,项目中的表中,A和B做了关联,而且设置了级联删除。
中间也有一些表达式。

但在大量删除A表数据时,效率很低,删除1000行数据耗时90秒

Dim st As Date = Date.Now
Dim t As Table = CurrentTable

t.StopRedraw
t.Select(t.TopPosition,0,t.BottomPosition,t.Cols.count - 1)
systemready = False
Syscmd.Row.Delete()
systemready = True
t.ResumeRedraw

output.Show("耗时: " & (Date.Now - st).TotalSeconds & "秒")

这个效率能提高吗
[此贴子已经被作者于2018/6/4 11:41:07编辑过]

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


加好友 发短信
等级:九尾狐 帖子:2239 积分:18446 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2018/6/4 11:42:00 [显示全部帖子]

附件
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:cssave.zip



 回到顶部