以文本方式查看主题 - Foxtable(狐表) (http://foxtable.com/bbs/index.asp) -- 专家坐堂 (http://foxtable.com/bbs/list.asp?boardid=2) ---- 查询超时 (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=191736) |
||||||||
-- 作者:nuoyan89 -- 发布时间:2024/5/6 20:10:00 -- 查询超时 老师,我以下代码写在窗口表的组件事件中的,上个月用得还好好的,现在点击时总提示查询超时,如图1 If Forms("资产折旧明细").Controls("加工日期1").Text = Nothing AndAlso Forms("资产折旧明细").Controls("加工日期2").Text = Nothing Then MessageBox.Show("使用月份不能为空!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information) Return Else Dim dr As Date = Forms("资产折旧明细").Controls("加工日期1").Text Dim dr1 As Date = Forms("资产折旧明细").Controls("加工日期2").Text Dim cmd As New SQLC ommand cmd.C cmd.C ommandText = "U PDATE a se t a.制造费用_设备折旧 = b.本月折旧 / c.加工时间 * a.加工时间 from 工序跟踪表 as a left join 资产折旧明细 as b on a.月份 = b.月份 and a.使用设备 = b.资产编号 and b.折旧类型 = \'按设备算\' inner join (S elect 月份,使用设备 , sum(加工时间) as 加工时间 From 工序跟踪表 g roup by 月份,使用设备) as c on a.月份 = c.月份 and a.使用设备 = c.使用设备 and a.实际加工日期 >= \'" & dr & "\'and a.实际加工日期 <= \'" & dr1 & "\'" cmd.E xecuteNonQuery() Dim cmd1 As New SQL Command cmd1.C cmd1.C ommandText = "UP DATE a1 S et a1.制造费用_其他折旧 = b1.本月折旧 / c1.加工时间 * a1.加工时间 From (S elect 月份, Sum(本月折旧) As 本月折旧 From 资产折旧明细 w here 折旧类型 = \'按汇总算\' group by 月份) as b1 ,工序跟踪表 as a1,(S elect 月份, sum(加工时间) as 加工时间 From 工序跟踪表 group by 月份 ) as c1 W here a1.月份 = b1.月份 and a1.月份=c1.月份 and a1.实际加工日期 >= \'" & dr & "\'and a1.实际加工日期 <= \'" & dr1 & "\'" cmd1.E xecuteNonQuery() End If [此贴子已经被作者于2024/5/6 20:10:44编辑过]
|
||||||||
-- 作者:有点蓝 -- 发布时间:2024/5/6 20:18:00 -- 应该是数据多了,给工序跟踪表、资产折旧明细表加上必要的索引:https://www.baidu.com/s?wd=SqlServer%20%E6%B7%BB%E5%8A%A0%E7%B4%A2%E5%BC%95 优化数据库可以看看:http://www.foxtable.com/bbs/dispbbs.asp?BoardID=2&ID=158943&replyID=&skin=1
[此贴子已经被作者于2024/5/6 20:43:33编辑过]
|
||||||||
-- 作者:nuoyan89 -- 发布时间:2024/5/6 20:35:00 --
我只需要算当月的,我现在是要算月份为202403,开始日期:2024-03-01,结束日期:2024-03-31,资产折旧明细表这个表里是79行,工序跟踪表这个表是11万行。不知道是不是因为一楼的代码分配了数据库的所有行了。代码如附件
[此贴子已经被作者于2024/5/6 20:35:21编辑过]
|
||||||||
-- 作者:有点蓝 -- 发布时间:2024/5/6 20:44:00 -- 和代码无关,优化数据库 ,加上索引 |
||||||||
-- 作者:nuoyan89 -- 发布时间:2024/5/6 20:49:00 -- 我想说的意思是我那代码是按照对应的月份在分配吗?比如:数据库后台工序跟踪表里数据有30万行,但是202403这个月份的只有11万,那个代码是直接分配这11万的还是30万行的 [此贴子已经被作者于2024/5/6 20:50:06编辑过]
|
||||||||
-- 作者:nuoyan89 -- 发布时间:2024/5/6 21:02:00 -- 或者能否把如图1圈起来的两个表改成用窗口表呢? ![]() ![]() |
||||||||
-- 作者:有点蓝 -- 发布时间:2024/5/6 21:09:00 -- 如果没有索引,数据库是搜索2个表所有的30W+11W数据,然后找出匹配的结果。 如果有合适的索引,数据库会根据索引信息,提取符合条件的数据,再进行匹配出结果。
|
||||||||
-- 作者:nuoyan89 -- 发布时间:2024/5/6 21:16:00 -- 6楼的可以改吗? |
||||||||
-- 作者:有点蓝 -- 发布时间:2024/5/6 21:52:00 -- 不可以。临时表无法使用sql |