Foxtable(狐表)用户栏目专家坐堂 → [求助]高效率地判断末级节点


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

主题:[求助]高效率地判断末级节点

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


加好友 发短信
等级:九尾狐 帖子:2221 积分:18261 威望:0 精华:0 注册:2011/11/26 20:21:00
[求助]高效率地判断末级节点  发帖心情 Post By:2016/10/10 14:48:00 [只看该作者]

查询与赋值并存,这个帮助章节里提到遍历里嵌套find或select导致效率降低。


我的示例中,同样也是10000行数据,但两种方法测试直接遍历赋值用时104秒,两次遍历用时反而用时更长128秒。


这是什么原因?还能优化之吗?


 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:管理项目60.rar



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


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

我测试两次遍历确实快。你的瓶颈在于like上面,这个效率非常低

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


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

我又试了多次,但是两次遍历较之一次,虽然快,但非常有限,10000行数据只在10秒左右,不象示例中的相差300倍那么明显。
既然like存在瓶颈,那么有什么好点的方法不?

比如增加一个辅助列如FCode,比如这一行的Code = 1.2.3.4,那么FCode = 1.2.3,就可以用=来判断,效率应当会高很多。
[此贴子已经被作者于2016/10/10 15:54:55编辑过]

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


加好友 发短信
等级:七尾狐 帖子:1731 积分:11255 威望:0 精华:0 注册:2011/12/15 22:06:00
  发帖心情 Post By:2016/10/10 15:58:00 [只看该作者]

修改下思路,基本上达到秒改,但是保存到数据库还是比较慢,没办法。代码如下

Dim st As Date = Date.Now
'要测试耗时的代码

Dim dt As DataTable = DataTables("D")
Dim lst As List(of DataRow) = dt.Select("","Code")
Dim iMax As Integer = lst.Count -1
For IntA As Integer = 0 To iMax
    If IntA < IMax Then 
        Dim dr1 As DataRow = lst(IntA)
        Dim dr2 As DataRow = lst(IntA+1)
        Dim str1 As String = dr1("Code") 
        Dim str2 As String = dr2("Code")
        dr1("Tree") = not str2.StartsWith(str1)
    Else
        lst(IntA)("Tree") = True
    End If 
Next

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

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


加好友 发短信
等级:九尾狐 帖子:2221 积分:18261 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2016/10/10 17:18:00 [只看该作者]

增加一个辅助列FCode,10000行数据,1秒内搞定。

find中用like效率很低,不知compute中或者deletefor这些中,使用like是否也是瓶颈?
-----实际测试,deletefor中用like,10000行数据几乎是秒删。
看来遍历中用find,而且用like,要用一些其它的手段来搞。
[此贴子已经被作者于2016/10/10 21:17:45编辑过]

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


加好友 发短信
等级:九尾狐 帖子:2221 积分:18261 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2016/10/20 14:44:00 [只看该作者]

查询与赋值并存

Dim lst1 As New List(of DataRow)
Dim
lst2 AS New List(of DataRow)
For Each
dr As DataRow In DataTables("表A").DataRows
    If DataTables(
"表A").Find("第二列 = " & dr("第一列")) Is Nothing Then
        lst1
.Add(dr)
    Else

        lst2
.Add(dr)
    End If
Next
For Each
dr As DataRow In lst1
    dr
("第三列") = True
Next
For Each
dr As DataRow In lst2
    dr
("第三列") = False
Next


实际测试,这里的条件如果包括有and 或or之类的,总之是多条件的话,效率会几何级数地下降。

所以,如果要遍历和赋值并存,最好用辅助列将条件合并为一个,效率会很高。


实际测试,

70000万数据,如果用了一次and,用时138秒;而用辅助列合并条件为一个,用时5秒。


 回到顶部