Foxtable(狐表)用户栏目专家坐堂 → 帮我提速啊~ 从 90几 秒提高到了 2 秒左右 就看代码强不强了。。。


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

主题:帮我提速啊~ 从 90几 秒提高到了 2 秒左右 就看代码强不强了。。。

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


加好友 发短信 一级勋章 三级勋章 二级勋章
等级:超级版主 帖子:6318 积分:33957 威望:0 精华:10 注册:2008/8/31 20:56:00
  发帖心情 Post By:2010/11/5 23:29:00 [显示全部帖子]

正常的方式好象提不了速。

 

比如:

 

Dim s2 As Date = Date.Now()
Dim Les As List(Of String) = DataTables("test").GetUniqueValues("[第三列] is not null","第二列")
For Each Le As String In Les
    Dim drs As List(Of DataRow) = DataTables("test").Select("[第二列] = " & Le)
    For n As Integer = 0 To drs.Count - 1
        If n > 0 Then
            drs(n)("第三列") = drs(n-1)("第三列")
        End If
    Next
   
Next
Output.Show("处理完毕! 耗时: " & (Date.Now -s2).TotalSeconds)

 

速度低的可怜。


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


加好友 发短信 一级勋章 三级勋章 二级勋章
等级:超级版主 帖子:6318 积分:33957 威望:0 精华:10 注册:2008/8/31 20:56:00
  发帖心情 Post By:2010/11/5 23:31:00 [显示全部帖子]

变态的方式。

 

Dim s2 As Date = Date.Now()
Dim dtb As New DataTableBuilder("Temp")
dtb.AddDef("第二列", Gettype(Double))
dtb.AddDef("第三列", Gettype(String),32)
dtb.TableVisible = False
dtb.Build()
Dim Les As List(Of String()) = DataTables("test").GetUniqueValues("[第三列] is not null","第二列","第三列")
For Each Le As String() In Les
    Dim r As Row = Tables("Temp").AddNew
    r("第二列") = Le(0)
    r("第三列") = Le(1)
Next
Relations.Add("关联",DataTables("Temp").DataCols("第二列"),DataTables("test").DataCols("第二列"),False)
DataTables("test").DataCols.Add("X", Gettype(String), "Parent(关联).第三列")
For Each dr As DataRow In DataTables("test").DataRows
    dr("第三列") = dr("X")
Next
Relations.Delete("关联")
DataTables("test").DataCols.Delete("X")
Output.Show("处理完毕! 耗时: " & (Date.Now -s2).TotalSeconds) '【0.9s  还行】

 


 


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


加好友 发短信 一级勋章 三级勋章 二级勋章
等级:超级版主 帖子:6318 积分:33957 威望:0 精华:10 注册:2008/8/31 20:56:00
  发帖心情 Post By:2010/11/5 23:52:00 [显示全部帖子]

我没办法了

PDATE直接后台计算居然比一楼代码还慢


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


加好友 发短信 一级勋章 三级勋章 二级勋章
等级:超级版主 帖子:6318 积分:33957 威望:0 精华:10 注册:2008/8/31 20:56:00
  发帖心情 Post By:2010/11/6 0:13:00 [显示全部帖子]

这个更快

 

Dim s2 As Date = Date.Now()
Dim dtb As New DataTableBuilder("Temp")
dtb.TableVisible = False
dtb.Build()
DataTables("Temp").Fill("Select * From {test}", True)
For Each dr As DataRow In DataTables("test").DataRows
    Dim dr1 As DataRow = DataTables("Temp").Find("第二列 = '" & dr("第二列") & "' And 第二列 Is Not Null")
    If dr1 IsNot Nothing
        dr("第三列") = dr1("第三列")
    End If
Next
Output.Show("处理完毕! 耗时: " & (Date.Now -s2).TotalSeconds)


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


加好友 发短信 一级勋章 三级勋章 二级勋章
等级:超级版主 帖子:6318 积分:33957 威望:0 精华:10 注册:2008/8/31 20:56:00
  发帖心情 Post By:2010/11/6 0:34:00 [显示全部帖子]

改成这样试试:

 

Dim s2 As Date = Date.Now()
Dim dtb As New DataTableBuilder("Temp")
dtb.TableVisible = False
dtb.Build()
DataTables("Temp").Fill("Select * From {test} Where 第三列 Is Not Null",True)
For Each dr As DataRow In DataTables("test").DataRows
    Dim dr1 As DataRow = DataTables("Temp").Find("第二列 = '" & dr("第二列") & "'")
    If dr1 IsNot Nothing Then
        dr("第三列") = dr1("第三列")
    End If
Next
Output.Show("处理完毕! 耗时: " & (Date.Now -s2).TotalSeconds)


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


加好友 发短信 一级勋章 三级勋章 二级勋章
等级:超级版主 帖子:6318 积分:33957 威望:0 精华:10 注册:2008/8/31 20:56:00
  发帖心情 Post By:2010/11/6 9:50:00 [显示全部帖子]

dt也是临时表,不过SQLCommand显示比fill方法来得快

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


加好友 发短信 一级勋章 三级勋章 二级勋章
等级:超级版主 帖子:6318 积分:33957 威望:0 精华:10 注册:2008/8/31 20:56:00
  发帖心情 Post By:2010/11/6 12:09:00 [显示全部帖子]

以下是引用mr725在2010-11-6 12:04:00的发言:

您的帮助文件应该增设一个特别提醒栏目,类似这样的话,可以加入进去,以提示基础差的我等。。。  100倍啊~ 足以提振信心了····    记得那位在一个窗口中用了几十个Table结果打开时特慢,如果有这样一个栏目提醒大家,不是更好吗~    图片点击可在新窗口打开查看

 

以前我是用Compute碰过到此类问题,后来老六测试后说是.net的一个bug,人家牛B什么bug都不改。


 回到顶部