Foxtable(狐表)用户栏目专家坐堂 → 数据效率问题


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

主题:数据效率问题

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


加好友 发短信
等级:一尾狐 帖子:405 积分:3572 威望:0 精华:0 注册:2014/1/8 17:12:00
数据效率问题  发帖心情 Post By:2017/4/2 9:37:00 [只看该作者]

Dim cmd As New SQLCommand
Dim dt As DataTable
cmd.C
If Tables("订单表并列_Table1").Rows.Count = 0 Then
    Tables("订单表并列_Table2").Fill("S elect * From {工序库明细主表} Where [_Identify] Is Null","s" ,False)
    Tables("订单表并列_Table2").SetColVisibleWidth("物料编码|60|部件名称|60|部件规格|80|部件量|55|编码|70")
    Tables("订单表并列_Table2").Cols.Remove("物料编码")
    Tables("订单表并列_Table2").Cols.Remove("编码")
Else
    Dim tbl As Table = Tables("订单表并列_Table1")
    Dim  cur,cur2,cur3 As String
    Dim cur1 As Double
    cur= tbl.current("产品编码")
    cur1= tbl.current("订单数量")
    cur2= tbl.current("内部加工单号")
    Tables("订单表并列_Table2").Fill("Se lect * From {工序库明细主表} where  物料编码 = '" & cur & "'ORDER BY 部件名称 ","s" ,False)
    Tables("订单表并列_Table2").SetColVisibleWidth("物料编码|60|部件名称|60|部件规格|80|部件量|55|编码|70")
    Tables("订单表并列_Table2").Cols.Remove("物料编码")
    'Tables("订单表并列_Table2").Cols.Remove("编码")
    'DataTables("订单表并列_Table2").DataCols.Add("部件总量", Gettype(Double), "[部件量] *" & cur1)
    'DataTables("订单表并列_Table2").DataCols.Add("人工量", Gettype(Double))
    'For Each dr As DataRow In DataTables("订单表并列_Table2").DataRows
    'cmd.CommandText = "S ELECT * From {清单} where 内部加工单号='" & cur2 & "'and 产品编码 ='" & cur & "'and 编码= '" & dr("编码")& "'"
    'dt = cmd.ExecuteReader()
    'Dim Total As Double  = dt.Compute("Sum(人工量)")
    'dr("人工量") = Total
    'Next
End If

加入红色代码。  后台统计符合条件的行  人工量的合计。速度非常慢。这里应该如何统计好。



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


加好友 发短信
等级:超级版主 帖子:13837 积分:69650 威望:0 精华:0 注册:2016/11/1 14:42:00
  发帖心情 Post By:2017/4/2 11:11:00 [只看该作者]

cmd.CommandText = "SELECT * From {清单} where 内部加工单号='" & cur2 & "'and 产品编码 ='" & cur & "'"
dt = cmd.ExecuteReader()
For Each dr As DataRow In DataTables("订单表并列_Table2").DataRows
    Dim Total As Double  = dt.Compute("Sum(人工量)", "编码= '" & dr("编码")& "'")
    dr("人工量") = Total
Next

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


加好友 发短信
等级:一尾狐 帖子:405 积分:3572 威望:0 精华:0 注册:2014/1/8 17:12:00
  发帖心情 Post By:2017/4/2 14:40:00 [只看该作者]

版主,速度还是很慢。

请教版主。类似这种,后台数据统计的设计思路。

现在我的设计这样,   产品   分  工序库明细主表(指产品可分的部件),工序库明细表(部件可分的组件),对应的工序表以及工序价格

我现在的{清单}是生成的最详细的工序表,包含订单、产品、部件、组件、工序、价格的一个查询表。里边有个  单个工序对应订单数量的人工量。

我现在是想实现  统计  部件   项下  人工量  之和。
后期还要对应的生产   产品  项下  所有部件 的人工量  之和。


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


加好友 发短信
等级:超级版主 帖子:13837 积分:69650 威望:0 精华:0 注册:2016/11/1 14:42:00
  发帖心情 Post By:2017/4/2 14:49:00 [只看该作者]

 不应该慢。实例发上来看看。

 

 如果需要生成查询表,可以把这几个表连接查询,最后再分组统计。


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


加好友 发短信
等级:一尾狐 帖子:405 积分:3572 威望:0 精华:0 注册:2014/1/8 17:12:00
  发帖心情 Post By:2017/4/2 15:12:00 [只看该作者]

Tables("订单表并列_Table2").Fill("Se lect 订单号,产品编码,部件名称,部件规格,部件量,部件编码,SUM(人工量) AS 人工量  From {清单} where  产品编码 = '" & cur & "' GROUP BY 订单号,产品编码,部件名称,部件规格,部件量,部件编码 ORDER BY 部件名称 ","s" ,True)

版主我直接改为这样查询,  速度有所提高,但感觉延迟还是有的。     清单  表 是一个很多表生产的查询表。 订单表  订单明细表,物料表,工序库明细主表,工序库明细表,工序表,工序价格。

怎样才能效率更高呢。这样,能得到想要的数据。

如果都从   清单  这个 sql  视图表中查询,速度不知道怎么样。

根据可以统计人工总量           订单号,产品编码   产品名称,  这样得到的字段  就是订单的一个明细表。
根据    订单号,产品编码,部件名称,部件规格,部件量    统计人工量。    其实根据  订单号,产品编码,部件编码就能得到数据。  但这样,部件名称,部件规格列就不显示
Se lect 订单号,产品编码,部件编码,SUM(人工量) AS 人工量  From {清单} where  产品编码 = '" & cur & "' GROUP BY 订单号,产品编码,部件编码 

这里的列多了,是不是影响统计速度。如果统计标准的列少了,如何显示 其他想要的列。

我现在  清单   后台视图 的行数才212行。
[此贴子已经被作者于2017/4/2 15:14:28编辑过]

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


加好友 发短信
等级:超级版主 帖子:13837 积分:69650 威望:0 精华:0 注册:2016/11/1 14:42:00
  发帖心情 Post By:2017/4/2 15:26:00 [只看该作者]

1、你要多少列,那你 GROUP BY  后面,就需要加入多少列。

 

2、你那个生成清单表的sql语句可能有问题,具体做个例子上来测试下。


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


加好友 发短信
等级:一尾狐 帖子:405 积分:3572 威望:0 精华:0 注册:2014/1/8 17:12:00
  发帖心情 Post By:2017/4/2 15:47:00 [只看该作者]

版主我是在表的 currentchanged  中设置代码的。

打开开窗口时,时间为0.16-0.4秒。

随后点击行的时候,时间在1.3-1.8秒波动。

另外,数据的位数影响速度吗。我  清单表中的人工量  保留四位小数。

查询后的数据   有的小数位数  是十六位的,等于字段长度。但有的不是。   

我单独做了个测试窗口,  清单表  总共  212行数据  根据下列办法生产 24行数据,时间2.2-2.4秒
Dim st As Date = Date.Now
'要测试耗时的代码
Tables("测试_Table1").Fill("S elect 产品编码,部件名称,部件规格,部件量,编码,SUM(人工量) AS 人工量  From {清单}  GROUP BY 产品编码,部件名称,部件规格,部件量,编码 ORDER BY 部件名称 ","s" ,True)
MessageBox.Show("耗时: " & (Date.Now - st).TotalSeconds & "秒")




下面这个加载  清单 全部数据    测试需要  0.11-0.13秒

Tables("测试_Table1").Fill("S elect * From {清单}  ","s" ,True)



[此贴子已经被作者于2017/4/2 16:18:57编辑过]

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


加好友 发短信
等级:超级版主 帖子:13837 积分:69650 威望:0 精华:0 注册:2016/11/1 14:42:00
  发帖心情 Post By:2017/4/2 19:51:00 [只看该作者]

1、如果你数据量不多,你可以全部数据加载出来,然后直接用分组统计。

 

2、Group by 肯定事件会长一些,越复杂的视图越慢。


 回到顶部