以文本方式查看主题 - Foxtable(狐表) (http://foxtable.net/bbs/index.asp) -- 专家坐堂 (http://foxtable.net/bbs/list.asp?boardid=2) ---- 数据效率问题 (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=98607) |
-- 作者:cuicuibing -- 发布时间: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 加入红色代码。 后台统计符合条件的行 人工量的合计。速度非常慢。这里应该如何统计好。 |
-- 作者:有点色 -- 发布时间: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 -- 发布时间:2017/4/2 14:40:00 -- 版主,速度还是很慢。 请教版主。类似这种,后台数据统计的设计思路。 现在我的设计这样, 产品 分 工序库明细主表(指产品可分的部件),工序库明细表(部件可分的组件),对应的工序表以及工序价格 我现在的{清单}是生成的最详细的工序表,包含订单、产品、部件、组件、工序、价格的一个查询表。里边有个 单个工序对应订单数量的人工量。 我现在是想实现 统计 部件 项下 人工量 之和。 后期还要对应的生产 产品 项下 所有部件 的人工量 之和。 |
-- 作者:有点色 -- 发布时间:2017/4/2 14:49:00 -- 不应该慢。实例发上来看看。
如果需要生成查询表,可以把这几个表连接查询,最后再分组统计。 |
-- 作者:cuicuibing -- 发布时间: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编辑过]
|
-- 作者:有点色 -- 发布时间:2017/4/2 15:26:00 -- 1、你要多少列,那你 GROUP BY 后面,就需要加入多少列。
2、你那个生成清单表的sql语句可能有问题,具体做个例子上来测试下。 |
-- 作者:cuicuibing -- 发布时间: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编辑过]
|
-- 作者:有点色 -- 发布时间:2017/4/2 19:51:00 -- 1、如果你数据量不多,你可以全部数据加载出来,然后直接用分组统计。
2、Group by 肯定事件会长一些,越复杂的视图越慢。 |