Foxtable(狐表)用户栏目专家坐堂 → [求助]查询与赋值并存的问题


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

主题:[求助]查询与赋值并存的问题

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


加好友 发短信
等级:九尾狐 帖子:2204 积分:18140 威望:0 精华:0 注册:2011/11/26 20:21:00
[求助]查询与赋值并存的问题  发帖心情 Post By:2018/6/7 19:13:00 [只看该作者]

我有一个项目,其中通过一个表构建了树,当选中树的节点后,在确定按钮中设置事件,让勾选的节点在表中的”temp“表达式列(逻辑型)中赋true
树节点即使有10000行,得到list(of datarow),非常快,也就是0.4秒左右。
但遍历这个list,使dr("Temp") = true,居然就宕机了。即使加了systemready = false也不行,再加StopRedraw也不行

后来试验把所有的表的表达式全部清除,效率就提高很多,总用时也就是5秒左右(但重置表达式就要用掉3秒左右,实际上赋true的用时很少)。而且这个表的数据列中并没有与Temp有关的任何事件
想请教:这会是什么问题?
[此贴子已经被作者于2018/6/7 19:15:47编辑过]

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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2018/6/7 20:24:00 [只看该作者]

如果temp参与表达式运算,那慢是肯定的。跨表引用、跨表统计的表达式很耗时的。

 

如果确实是表达式列的问题,那就把表达式列改成数据列或者临时的数据列。


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


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

因为本身在设计的时候,就是考虑到有时候要判断它是否会勾选上,为了避免在很多地方去增加临时列的麻烦,所以直接增加了一个表达式列,但没有任何计算公式
而且检查过所有的表事件的代码,在表事件中都没有temp被引用,或者被用于计算的地方。
只有在窗口事件中,才会有与temp有关的事件。但都不涉及到引用或计算
太怪异了
而且在赋值之前,都增加了一个datatables("X").datacols("Temp").expression = ""
[此贴子已经被作者于2018/6/7 22:22:51编辑过]

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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2018/6/7 22:25:00 [只看该作者]

做个例子上来测试。

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


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

随机生成A、B、AB表。A和A关联、B和AB关联

三个表的Temp本身没有表达式、没有计算式。

然后随机从A表中取一些行来赋值,获得行的集合很快,但赋值超级慢
从AB表中随机取一些行来赋值,赋值秒完成。

小结:是不是主表的临时逻辑列赋值就会很慢?
但是如果把所有表的表达式列全部清空之后,赋值又速度很快,一般40000行数据全部赋true,也只需要7秒左右,但如果项目的表比较多、数据行数量大、表达式(主要是引用表达式)较多的话,表达式重置公式时间会很长。
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:主表赋值速度慢.zip

[此贴子已经被作者于2018/6/8 13:04:30编辑过]

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


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

上面只是一个例子的说明,而实际上可能AB表又是另一个表C的主表。当出现这种情况的时候,Temp列赋值的速度应当也快不了。尤其是当表C的数据行多的时候

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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2018/6/8 14:35:00 [只看该作者]

赋值后,会触发计算表达式的。没办法,必须清空表达式

 

http://www.foxtable.com/webhelp/scr/1935.htm

 


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


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

结果是这样的
A表增加10000行耗时: 3.3651925秒
B表增加400行耗时: 3.5462028秒
AB表清空计算式耗时: 3.548203秒
AB表增加40000行耗时: 9.9075667秒
AB表填充40000行数据耗时: 42.4884302秒
AB表重置计算式耗时: 42.5414332秒
从A表随机获需要赋Temp的行耗时: 42.5434334秒
A表的Temp表达式清空耗时: 42.5444334秒
A表的Temp赋值耗时: 204.0006682秒                    瓶颈就在这里,A表的Temp列赋值耗时太长
从AB表随机获需要赋Temp的行耗时: 204.0086686秒
AB表的Temp表达式清空耗时: 204.0116688秒
AB表的Temp赋值耗时: 205.676764秒                      AB表数据量比A表大了一倍,但是给Temp列赋值时间只有1.6秒            
从B表随机获需要赋Temp的行耗时: 205.676764秒
B表的Temp表达式清空耗时: 205.676764秒
B表的Temp赋值耗时: 206.1047885秒         B表数据量虽然很少,但它是AB表的主表,所以耗时也有0.4秒,如果B表的数据量跟A表一样的话,估计耗时一样

问题是:Temp列根本不参与任何计算,仅仅只是显示而已 ,会导致重新计算?

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


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

表中的Temp列,本身就没有表达式,也不参与任何计算,只是随机从表中取出一些行来,给Temp列赋值而已啊。
这也会导致重新计算?
如果有一列V=A*P,给A赋值,会导致重新计算V。但V本身并不参与任何列的计算呀

是不是不应当用datatables("A").datacols("Temp").expression = ""
而应当用datatables("A").replacefor("Temp","false","")
[此贴子已经被作者于2018/6/8 15:09:36编辑过]

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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2018/6/8 15:06:00 [只看该作者]

任何修改都会触发表达式重新计算。

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