Foxtable(狐表)用户栏目专家坐堂 → 执行效率测试


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

主题:执行效率测试

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


加好友 发短信
等级:版主 帖子:5246 积分:33163 威望:0 精华:8 注册:2013/1/17 21:28:00
执行效率测试  发帖心情 Post By:2014/4/10 15:18:00 [只看该作者]

五万行的数据。

 

先清空计算结果列(初始是清空的)

 

两种不同的代码:

RaiseDataColChanged,差不多就是死机,时间太长,等不起。

用SQLCommand,十几分钟或二十几分钟。

 

 

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:执行效率测试.rar


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


加好友 发短信
等级:八尾狐 帖子:1812 积分:12999 威望:0 精华:14 注册:2008/10/11 18:07:00
  发帖心情 Post By:2014/4/10 15:46:00 [只看该作者]

兩種方法,代碼都有改善空間吧

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


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

 测试了一下,用datacolchanged,几十秒。

 

 方案:把对应数据fill到一个附加表去,然后去这张表里查询统计sum值

 

 方案2:如果是一次性的话,可根据情况用代码统计值,而不用sum函数

 

 原因:http://www.foxtable.com/help/topics/2225.htm

 


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


加好友 发短信
等级:版主 帖子:5246 积分:33163 威望:0 精华:8 注册:2013/1/17 21:28:00
  发帖心情 Post By:2014/4/10 15:57:00 [只看该作者]

直接这样,比较快:

Dim now As Date = Date.Now
Dim tp As TimeSpan
Dim cmd As New SQLCommand
cmd.CommandText = "Select 单据号,Sum(成本金额) As 零售金额 From {药品收发记录} Group By 单据号"
Dim dt As DataTable = cmd.ExecuteReader


Dim f As New Filler
f.SourceTable = dt '指定数据来源
f.SourceCols = "零售金额" '指定数据来源列
f.DataTable = DataTables("药品收发记录") '指定数据接收表
f.DataCols = "零售金额" '指定数据接收列
f.Fill() '填充数据
DataTables("药品收发记录").Load
tp = Date.Now - now
MessageBox.Show(tp.TotalSeconds)


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


加好友 发短信
等级:管理员 帖子:47497 积分:251403 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2014/4/10 15:59:00 [只看该作者]

DataColChanged可不止几十秒,除非之前用其他方法算过一次,表中已经有算好的值。

 

在我的i5笔记本,12秒完成:

 

Dim dt As Date =Date.now()
Dim dic As new Dictionary(of String,Double)
Dim nms As List(of String) = DataTables("药品收发记录").GetValues("单据号")
For Each nm As String In nms
    dic.Add(nm,DataTables("药品收发记录").Compute("Sum(成本金额)","单据号 = '" & nm & "'"))
Next
Dim drs As List(of DataRow) = DataTables("药品收发记录").Select("单据号 is not null","单据号")
drs(0)("零售金额") = dic(drs(0)("单据号"))
For i As Integer = 1 To drs.count -1
    If drs(i)("单据号") =  drs(i-1)("单据号") Then
        drs(i)("零售金额") = drs(i-1)("零售金额")
    Else
        drs(i)("零售金额") = dic(drs(i)("单据号"))
    End If
Next
messagebox.show((Date.now - dt).TotalSeconds)

[此贴子已经被作者于2014-4-10 16:01:23编辑过]

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


加好友 发短信
等级:五尾狐 帖子:1100 积分:8985 威望:0 精华:0 注册:2014/3/15 14:36:00
  发帖心情 Post By:2014/4/10 16:26:00 [只看该作者]

以下是引用lsy在2014-4-10 15:57:00的发言:

直接这样,比较快:

Dim now As Date = Date.Now
Dim tp As TimeSpan
Dim cmd As New SQLCommand
cmd.CommandText = "Select 单据号,Sum(成本金额) As 零售金额 From {药品收发记录} Group By 单据号"
Dim dt As DataTable = cmd.ExecuteReader


Dim f As New Filler
f.SourceTable = dt '指定数据来源
f.SourceCols = "零售金额" '指定数据来源列
f.DataTable = DataTables("药品收发记录") '指定数据接收表
f.DataCols = "零售金额" '指定数据接收列
f.Fill() '填充数据
DataTables("药品收发记录").Load
tp = Date.Now - now
MessageBox.Show(tp.TotalSeconds)

不能填充数据!


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


加好友 发短信
等级:版主 帖子:5246 积分:33163 威望:0 精华:8 注册:2013/1/17 21:28:00
  发帖心情 Post By:2014/4/10 16:36:00 [只看该作者]

快慢都保留着,看情况选用。

狐爸的方法不错。


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


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


update a set a.零售金额 = b.零售金额 from {药品收发记录} a inner join (Select 单据号,Sum(成本金额) As 零售金额 From {药品收发记录} Group By 单据号) b on a.单据号 = b.单据号
这句话居然不能执行,提示操作符丢失?

这个耗时主要在保存与LOAD上,代码没太大问题。

照成这个操作结果主要是表结构设计不合理,这张表时严重不符合数据库要求。设计合理点,用查询表直接就解决了

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


加好友 发短信
等级:管理员 帖子:47497 积分:251403 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2014/4/10 16:49:00 [只看该作者]

哈哈,这样好,1秒不到就可以了。

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


加好友 发短信
等级:版主 帖子:5246 积分:33163 威望:0 精华:8 注册:2013/1/17 21:28:00
  发帖心情 Post By:2014/4/10 17:07:00 [只看该作者]

以下是引用jspta在2014-4-10 16:45:00的发言:

update a set a.零售金额 = b.零售金额 from {药品收发记录} a inner join (Select 单据号,Sum(成本金额) As 零售金额 From {药品收发记录} Group By 单据号) b on a.单据号 = b.单据号
这句话居然不能执行,提示操作符丢失?

这个耗时主要在保存与LOAD上,代码没太大问题。

照成这个操作结果主要是表结构设计不合理,这张表时严重不符合数据库要求。设计合理点,用查询表直接就解决了

就是测试代码效率,赋值到数据表,不是查询表。


 回到顶部
总数 35 1 2 3 4 下一页