老师,我以下代码写在窗口表的组件事件中的,上个月用得还好好的,现在点击时总提示查询超时,如图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
此主题相关图片如下:1.png
此主题相关图片如下:2.png
[此贴子已经被作者于2024/5/6 20:10:44编辑过]
应该是数据多了,给工序跟踪表、资产折旧明细表加上必要的索引:
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编辑过]
我只需要算当月的,我现在是要算月份为202403,开始日期:2024-03-01,结束日期:2024-03-31,资产折旧明细表这个表里是79行,工序跟踪表这个表是11万行。不知道是不是因为一楼的代码分配了数据库的所有行了。代码如附件
此主题相关图片如下:1.png
此主题相关图片如下:2.png
[此贴子已经被作者于2024/5/6 20:35:21编辑过]
我想说的意思是我那代码是按照对应的月份在分配吗?比如:数据库后台工序跟踪表里数据有30万行,但是202403这个月份的只有11万,那个代码是直接分配这11万的还是30万行的
[此贴子已经被作者于2024/5/6 20:50:06编辑过]
如果没有索引,数据库是搜索2个表所有的30W+11W数据,然后找出匹配的结果。
如果有合适的索引,数据库会根据索引信息,提取符合条件的数据,再进行匹配出结果。