安静点吧 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日

悬赏问题

  • ¥15 在若依框架下实现人脸识别
  • ¥15 网络科学导论,网络控制
  • ¥100 安卓tv程序连接SQLSERVER2008问题
  • ¥15 利用Sentinel-2和Landsat8做一个水库的长时序NDVI的对比,为什么Snetinel-2计算的结果最小值特别小,而Lansat8就很平均
  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同