sql语句查询条件的值改变速度无比慢?

KevinLiu-888 2013-11-20 09:39:57
select
distinct b.HoursProductionID, b.WorkBill,b.ContractNO,b.ProductName,b.ContractQty,b.Unit, b.BindSubType,b.bussinessID,
g.MasterType,g.SubType,h.DepartmentCode,h.TradeType,g.Qty,
ISNULL(case when b.IsDuplicate=1 and len(b.WorkBillFlag)=9 then 0
else ( select convert(decimal(18,4),x.CostPrice) from GetRationCostByWorkBill (b.WorkBillFlag,b.bussinessID) x ) end,0) as RationCost,--定量材料价格
ISNULL(SUM(CASE WHEN charindex('印刷',d.ProcessName) > 0 THEN (a.UnitProduction * c.FixMaterial) ELSE (a.Production * c.FixMaterial) END ),0)AS QuotaCost, --定额材料价格
ISNULL(SUM(CASE WHEN charindex('印刷',d.ProcessName) > 0 THEN (a.UnitProduction * c.LimitMaterial) ELSE (a.Production * c.LimitMaterial) END),0) AS LimitCost, --限量材料
ISNULL(SUM(CASE WHEN charindex('印刷',d.ProcessName) > 0 THEN (a.UnitProduction * c.PointMaterial) ELSE (a.Production * c.PointMaterial) END),0) AS PointCost,--定点材料
ISNULL(SUM(a.Hours * c.FixArtificial),0) AS ArtifCost,--人工
ISNULL(SUM(a.Hours * c.Utility),0) AS UtilityCost, --水电
ISNULL(SUM(a.Hours * c.ChangeCost),0) AS ChangeCost,--制造费用
ISNULL(SUM(a.Hours * c.FactoryRent),0) AS FactoryCost, --厂租
ISNULL(SUM(a.Hours * c.Depreciation),0) AS DepreCost, --折旧
ISNULL(i.Amount,0 ) as ZZDeptCost, --装帧成本
ISNULL(e.NoTaxAmount,0 ) as TMCost, --烫金、激光模切:生产采购费用
ISNULL(f.NoTaxAmount,0 ) as OutCost, --外发加工费
ISNULL( case when b.IsDuplicate=1 then 0
else g.Amount end, 0) as SalesRevenue --销售收入

from Cost_HoursProductionDetail a
left join Cost_HoursProduction b on a.HoursProductionID=b.HoursProductionID
left join Cost_ProcessFixData c on a.ProcessFixDataID=c.ProcessFixDataID
left join Cost_Process d on a.ProcessID=d.ProcessID
left join (
SELECT sum(NoTaxAmount) as NoTaxAmount,WorkBill,bussinessID
FROM dbo.Cost_ProductionProcureDetail AS x1 INNER JOIN dbo.Cost_ProductionProcurement AS x2 ON x1.ProcureID = x2.ProcureID
WHERE (x2.ApproveStatus = 9) group by x1.WorkBill,x2.bussinessID
) e on e.WorkBill=b.WorkBill and e.bussinessID=b.bussinessID
left join (
SELECT sum(NoTaxAmount) as NoTaxAmount,WorkBill,bussinessID
FROM dbo.Cost_OutSideDetail AS x1 INNER JOIN dbo.Cost_OutSide AS x2 ON x1.OutSideID = x2.OutSideID
WHERE (x1.IsSpecial = '是') AND (x2.ApproveStatus = 9) group by x1.WorkBill,x2.bussinessID
) f on f.WorkBill=b.WorkBill and f.bussinessID=b.bussinessID
left join
(
SELECT sum(Amount) as Amount,WorkBill,bussinessID
FROM dbo.Cost_BookBindDetail AS x1 INNER JOIN dbo.Cost_BookBinding AS x2 ON x1.BookBindID = x2.BookBindID
WHERE (x2.ApproveStatus = 9) group by x1.WorkBill,x2.bussinessID
) i on i.WorkBill=b.WorkBill and i.bussinessID=b.bussinessID
left join Cost_ContractDetail g on g.ContractNO=b.ContractNO and g.ProductName=b.ProductName
left join Cost_Contract h on h.ContractID=g.ContractID

where (g.Amount>0 or h.IsNoAmountContract='是')
and b.ApproveStatus=9
and h.ApproveStatus=9
and (
( b.ApproveEndDt>='2013-11-01'
and convert(nvarchar,b.ApproveEndDt,23)<='2013-11-30'
and h.ApproveEndDt>='2013-11-01' and convert (nvarchar,h.ApproveEndDt,23)<='2013-11-30'
)
or( h.ApproveEndDt<='2013-11-01'
and b.ApproveEndDt>='2013-11-01' and convert(nvarchar, b.ApproveEndDt,23)<='2013-11-30'
)
or( b.ApproveEndDt<='2013-11-01'
and h.ApproveEndDt>='2013-11-01' and convert(nvarchar, h.ApproveEndDt,23)<='2013-11-30'
)
)
and B.BussinessID='132'//如果去掉这个条件,或者BussinessID=其他值,速度较 快,大概6,7秒出数据。
group by b.HoursProductionID,b.ContractNO,b.ProductName,
b.WorkBill,b.workbillFlag,b.ContractQty,b.bussinessID,b.Unit,
b.ApproveEndDt,b.IsDuplicate,
g.MasterType,g.SubType,b.BindSubType,
h.DepartmentCode,h.TradeType,g.Qty,
g.Amount,e.NoTaxAmount,f.NoTaxAmount,i.Amount


说明:B.BussinessID='132'//速度巨慢,180秒,如果去掉这个条件,或者BussinessID=其他值,速度较 快,大概6,7秒出数据。测试发现如果注释掉ISNULL(SUM(a.Hours * c.FactoryRent),0) AS FactoryCost, --厂租
这些带有ISNULL的语句整个查询变得特别快。
请高手帮忙指点一下,实在没辙了,谢谢!
...全文
435 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
LongRui888 2013-11-20
  • 打赏
  • 举报
回复
这个BussinessID 字段是什么类型的,一般看ID都是int类型的把。 你改成这样试试,能不能快点: B.BussinessID= 132
xiaoxiangqing 2013-11-20
  • 打赏
  • 举报
回复
这个需要看执行计划,才知道是哪个地方出的问题
KevinLiu-888 2013-11-20
  • 打赏
  • 举报
回复
from Cost_HoursProductionDetail a left join Cost_HoursProduction b on a.HoursProductionID=b.HoursProductionID left join 改成left hash join,速度立马变快了,感谢yupeigu阳泉酒家小当家的热情帮助。 还特意加我qq,远程帮我调试。真的非常感谢!
KevinLiu-888 2013-11-20
  • 打赏
  • 举报
回复
引用 15 楼 SQL 的回复:
这么一大堆,不慢才怪呢
嗯,是个报表,所有关联的表与点多。 但因为对sql优化不熟悉,刚开始没什么数据的时候,报表数据比较快,现在越来越慢了。有什么建议没!
發糞塗牆 2013-11-20
  • 打赏
  • 举报
回复
但是开销就在那个表上面,你还是先用DTA检查一下
  • 打赏
  • 举报
回复
这么一大堆,不慢才怪呢
KevinLiu-888 2013-11-20
  • 打赏
  • 举报
回复


已经建立索引,如上图。where条件是查询的主表,主要是根据时间作为条件。Cost_HoursProductionDetail 没有在查询条件内。查询是按分页来取的,就15条。

如果不分页,数据量可能也就100,200条,因为是按月份取的值。
發糞塗牆 2013-11-20
  • 打赏
  • 举报
回复
这个表HoursProductionID、ProcessFixDataID、ProcessID上有索引吗?你的查询竟然没有where条件用到这个表?还有返回的数据量有多少啊?
KevinLiu-888 2013-11-20
  • 打赏
  • 举报
回复

不好意思,上qq上惯了,版主你好!
發糞塗牆 2013-11-20
  • 打赏
  • 举报
回复
把你的代码放到一个查询窗口,右键空白处,选择数据库引擎优化顾问,然后直接点开始分析,看看有什么建议,按照你的描述,应该是对应的列上缺少索引
發糞塗牆 2013-11-20
  • 打赏
  • 举报
回复
我不是群主
發糞塗牆 2013-11-20
  • 打赏
  • 举报
回复
执行计划贴百分比最高的那部分
KevinLiu-888 2013-11-20
  • 打赏
  • 举报
回复
引用 5 楼 DBA_Huangzj 的回复:
1、统计信息不够新,update statistics '用到的表'
2、数据分布不均匀,查询过程中应该用了并行执行(可以看执行计划),查查sselect top 5 * from sys.dm_os_wait_stats order by wait_time_ms DESC
应该会有CXPACKET这些等待状态
3、贴出执行计划


群主你好,确实有CXPACKET这些等待状态,另外执行计划如何贴出来,计划很长,图又截不全?不好意思。。
KevinLiu-888 2013-11-20
  • 打赏
  • 举报
回复
引用 5 楼 DBA_Huangzj 的回复:
1、统计信息不够新,update statistics '用到的表'
2、数据分布不均匀,查询过程中应该用了并行执行(可以看执行计划),查查sselect top 5 * from sys.dm_os_wait_stats order by wait_time_ms DESC
应该会有CXPACKET这些等待状态
3、贴出执行计划



群主你好,1.所有表已经执行update statistics
2.select top 5 * from sys.dm_os_wait_stats 有CXPACKET这些状态,见附件。
3.执行计划很长,不知道怎么发上来,截图又不好截,还请详细指点一下,谢谢!
發糞塗牆 2013-11-20
  • 打赏
  • 举报
回复
回复请引用。
發糞塗牆 2013-11-20
  • 打赏
  • 举报
回复
1、统计信息不够新,update statistics '用到的表' 2、数据分布不均匀,查询过程中应该用了并行执行(可以看执行计划),查查sselect top 5 * from sys.dm_os_wait_stats order by wait_time_ms DESC 应该会有CXPACKET这些等待状态 3、贴出执行计划
LongRui888 2013-11-20
  • 打赏
  • 举报
回复
引用 3 楼 lkw0312_ 的回复:
你好,阳泉酒家小当家 ,B.BussinessID= 132 速度也很慢,如果改成B.BussinessID= 31,或者去掉这个查询条件,速度比较快。
你试试运行这个,是更新统计信息的: update statistics Cost_HoursProduction
KevinLiu-888 2013-11-20
  • 打赏
  • 举报
回复
你好,阳泉酒家小当家 ,B.BussinessID= 132 速度也很慢,如果改成B.BussinessID= 31,或者去掉这个查询条件,速度比较快。

684

社区成员

发帖
与我相关
我的任务
社区描述
智能路由器通常具有独立的操作系统,包括OpenWRT、eCos、VxWorks等,可以由用户自行安装各种应用,实现网络和设备的智能化管理。
linuxpython 技术论坛(原bbs)
社区管理员
  • 智能路由器社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧