以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  生成统计效率的问题  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=40670)

--  作者:blackzhu
--  发布时间:2013/9/26 11:43:00
--  生成统计效率的问题
日期是1年的条件:

    下面的代码 生成的统计表是300条不到的数据量,但是我再次汇总到我需要的表里面,用的时间切有3到4秒左右
 是不是我的电脑太旧还是代码有大问题?


Filter = "日期 >= \'" & dt1 & "\' And 日期 <= \'" & dt2 & "\'And 报表名称=\'" & e.Node.Name & "\'And [部门] =\'" & e.Node.ParentNode.Name & "\'"
            Dim g As New GroupTableBuilder("统计表4", DataTables("管组民警数据"))
            g.Groups.AddDef("部门")
          
            g.Groups.AddDef("项目")
           
            g.Groups.AddDef("报表名称")
            g.Groups.AddDef("统计类型")
            g.Groups.AddDef("数据统计项目")
            g.Groups.AddDef("日期", DateGroupEnum.None)
            g.Totals.AddDef("数据")
            g.FromServer = True
            g.Filter = Filter
            g.Build()

            Dim f As New Filler
            f.SourceTable = DataTables("统计表4")
            f.SourceCols = "部门,报表名称,数据统计项目,统计类型,项目"
            f.DataTable = Tables("统计部门分析_Table1").DataTable
            f.DataCols = "部门,报表名称,数据统计项目,统计类型,项目"
            f.Filter = "部门=\'" & e.Node.ParentNode.Name & "\'And 报表名称=\'" & e.Node.Name & "\'"
            f.ExcludeExistValue = True
            f.ExcludeNullValue = True
            f.Distinct = True
            f.Append = True
            f.fill

            Arys = DataTables("统计表4").GetUniqueValues("部门 Is Not Null","部门","报表名称","项目","统计类型","数据统计项目")
            For Each Ary As String() In Arys
                Filter = "[部门] = \'" & Ary(0) & "\'And 报表名称=\'" & Ary(1) & "\'And 项目 = \'"  & Ary(2) & "\'And 统计类型 =\'" & Ary(3) & "\'And 数据统计项目=\'" & Ary(4) & "\'"
                Ar = Tables("统计部门分析_Table1").DataTable.Find(Filter)
                If Ar IsNot Nothing Then
                    Dim s() As String = {"一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"}
                    For i As Integer = 0 To s.Length - 1
                        dt1 = New Date(y, i+1, 1)
                        dt2 = New Date(y, i+1, Date.DaysInMonth(y,i+1)) \'获取该月的最后一天
                        Filter1 = "日期 >= \'" & dt1 & "\' And 日期 <= \'" & dt2 & "\'And [部门] = \'" & Ary(0) & "\' And 报表名称=\'" & Ary(1) & "\'And 项目 = \'"  & Ary(2) & "\'And 统计类型 =\'" & Ary(3) & "\'And 数据统计项目=\'" & Ary(4) & "\'"
                        Val= DataTables("统计表4").Compute("Sum(数据)",Filter1)
                        If Val > 0 Then
                            ar(s(i)) = Val
                        Else
                            Ar(s(i)) = 0
                        End If
                    Next
                End If
            Next

--  作者:blackzhu
--  发布时间:2013/9/26 13:09:00
--  
    测试了一下 生成统计表时间是0.4-0.6秒不等,执行到填充的结束的时间是0.7秒,生成统计数据是3.7秒,300条数据统计居然花了3秒的时间. 


 Arys = DataTables("统计表4").GetUniqueValues("部门 Is Not Null","部门","报表名称","项目","统计类型","数据统计项目")
            For Each Ary As String() In Arys
                Filter = "[部门] = \'" & Ary(0) & "\'And 报表名称=\'" & Ary(1) & "\'And 项目 = \'"  & Ary(2) & "\'And 统计类型 =\'" & Ary(3) & "\'And 数据统计项目=\'" & Ary(4) & "\'"
                Ar = Tables("统计部门分析_Table1").DataTable.Find(Filter)
                If Ar IsNot Nothing Then
                    Dim s() As String = {"一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"}
                    For i As Integer = 0 To s.Length - 1
                        dt1 = New Date(y, i+1, 1)
                        dt2 = New Date(y, i+1, Date.DaysInMonth(y,i+1)) \'获取该月的最后一天
                        Filter1 = "日期 >= \'" & dt1 & "\' And 日期 <= \'" & dt2 & "\'And [部门] = \'" & Ary(0) & "\' And 报表名称=\'" & Ary(1) & "\'And 项目 = \'"  & Ary(2) & "\'And 统计类型 =\'" & Ary(3) & "\'And 数据统计项目=\'" & Ary(4) & "\'"
                        Val= DataTables("统计表4").Compute("Sum(数据)",Filter1)
                        If Val > 0 Then
                            ar(s(i)) = Val
                        Else
                            Ar(s(i)) = 0
                        End If
                    Next
                End If
            Next

  求教:   所以这段代码有无其他比较速度快的写法? 
[此贴子已经被作者于2013-9-26 13:08:56编辑过]

--  作者:不倒的翁
--  发布时间:2013/9/26 13:55:00
--  
                     For i As Integer = 0 To s.Length - 1
                        dt1 = New Date(y, i+1, 1)
                        dt2 = New Date(y, i+1, Date.DaysInMonth(y,i+1)) \'获取该月的最后一天
                        Filter1 = " 日期 >= \'" & dt1 & "\' And 日期 <= \'" & dt2 & "\'And [部 门] = \'" & Ary(0) & "\' And 报表名称=\'" & Ary(1) & "\'And 项 目 = \'"  & Ary(2) & "\'And 统计类型 =\'" & Ary(3) & "\'And 数据统计项 目=\'" & Ary(4) & "\'"
                        Val= DataTables("统计表4").Compute("Sum(数据)",Filter1)
                        If Val > 0 Then
                            ar(s(i)) = Val
                        Else
                            Ar(s(i)) = 0
                        End If
                    Next

查询与赋值并存不是会降低效率么。。
http://www.foxtable.com/help/topics/2225.htm

--  作者:blackzhu
--  发布时间:2013/9/26 13:59:00
--  
谢谢!  我看看
--  作者:blackzhu
--  发布时间:2013/9/26 14:21:00
--  
我测试了下 也需要4秒  是不是异表的关系,这个例子 老大说是本表的速度.
--  作者:不倒的翁
--  发布时间:2013/9/26 14:54:00
--  
 异表用多表查询,嵌套查询能否加速呢?
--  作者:blackzhu
--  发布时间:2013/9/26 15:04:00
--  
理论上 我这个应该是没有问题的  为啥300行数据的数据汇总会有几秒呢!
--  作者:狐狸爸爸
--  发布时间:2013/9/26 15:12:00
--  

最好用例子说话,瞎猜没意思。

数据保密不是理由,可以用a1、a2、a3代替。


--  作者:blackzhu
--  发布时间:2013/9/26 15:32:00
--  
老大  我 做个例子上来 你帮我改改.
--  作者:blackzhu
--  发布时间:2013/9/26 15:52:00
--  
    上传的这个例子的代码是和我现在做的代码一模一样  只是原来的代码多了个 生成统计表的过程. 我刚才测试时去掉这个生成统计表4的过程,生成我需要的统计表是4秒多.

     上传的这个例子的统计表4我直接做好,同样去掉这个生成统计表4的过程,我现在测试用了约1.8秒. 速度上有变化. 
统计表的结构和数据量是一模一样的. 为啥有2秒多的差异我就不明白了.   但是就是1.8秒 还是觉得有点慢了.


 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:统计.table