以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  执行效率测试  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=49005)

--  作者:lsy
--  发布时间:2014/4/10 15:18:00
--  执行效率测试

五万行的数据。

 

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

 

两种不同的代码:

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

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

 

 

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


--  作者:don
--  发布时间:2014/4/10 15:46:00
--  
兩種方法,代碼都有改善空間吧
--  作者:有点甜
--  发布时间:2014/4/10 15:49:00
--  

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

 

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

 

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

 

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

 


--  作者: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)


--  作者:狐狸爸爸
--  发布时间: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编辑过]

--  作者:黄训良
--  发布时间: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
--  发布时间:2014/4/10 16:36: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上,代码没太大问题。

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

--  作者:狐狸爸爸
--  发布时间:2014/4/10 16:49:00
--  
哈哈,这样好,1秒不到就可以了。
--  作者:lsy
--  发布时间: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上,代码没太大问题。

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

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