安静点吧 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 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。