安静点吧 2021-12-29 11:04 采纳率: 100%
浏览 24
已结题

悬赏:MSSQL 表连接长语句性能优化案例求解答?

十分钟调用一次服务器数据库的长SQL语句,当数据量逐渐增大,运行效率是否会下降?求该怎么优化??
(注释:D表为所有物料的限制车数,F为采购,销售合并的厂内车数,SIP_ScaleSales和SIP_ScalePurch 为流水,会逐渐增大 )

select D.FItemName,D.FLimitNum,ISNULL(F.FCurrentNum,0) FCurrentNum from
( select FItemName,FLimitNum from SIP_MaterialInsLimit WHERE FCancel =0 AND FDeleted = 0) D
LEFT JOIN
(
select A.FItemName,A.FLimitNum,COUNT(B.FID) FCurrentNum from SIP_MaterialInsLimit AS A
inner join SIP_ScalePurch AS B on A.FItemID = B.FItemID
Where A.FClassTypeID = 2 group by A.FLimitNum,A.FItemName
UNION
select A.FItemName,A.FLimitNum,COUNT(B.FID) FCurrentNum from SIP_MaterialInsLimit AS A
inner join SIP_ScaleSales AS B on A.FItemID = B.FItemID
Where A.FClassTypeID = 1 group by A.FLimitNum,A.FItemName
) F ON D.FItemName=F.FItemName

img

该怎么做才能让SQL运行效率提高?

  • 写回答

2条回答 默认 最新

  • DarkAthena ORACLE应用及数据库设计方案咨询师 2021-12-29 15:33
    关注

    一:最显眼的,把union 改成 union all试试
    二:你这sql写得太繁杂了,同一个表查了3次,而且3张表的关联条件明明就是FItemID,为啥还要转换成FItemName去关联?还有,如果同一个物料在销售和采购里都有数据,你这一匹配不会导致缺失或者翻倍?不是应该求和后再匹配么?还有一个问题,既然是流水表,难道每次都要对历史数据进行全量统计,就没个时间范围么?
    慢不是因为sql长,而是这个sql本就写得有问题。
    你比较一下下面这个sql和你的区别

    select a.FItemName,
               a.FLimitNum,
               ISNULL( v.FCurrentNum, 0 ) FCurrentNum 
        from SIP_MaterialInsLimit a left join 
        (select FItemID ,sum(FCurrentNum) FCurrentNum from 
        (select FItemID,count(1) FCurrentNum from SIP_ScalePurch group by FItemID 
        union all
        select FItemID,count(1) FCurrentNum from SIP_ScaleSales group by FItemID ) b) v
      on a.FItemID=v.FItemID
        where a.FCancel = 0 AND a.FDeleted = 0;
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 1月7日
  • 已采纳回答 12月30日
  • 创建了问题 12月29日

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?