from JSHX_EM_StkRecordLine srl
left join JSHX_EM_StkRecord sr on srl.cHeadGUID=sr.cGUID
left join CM_Material cm on srl.cMatGUID=cm.cGUID
left join CM_Unit cu on srl.cUnitGUID = cu.cGUID
left join CM_Unit cMu ON srl.cMUnitGUID = cMu.cGUID
left join JSHX_EM_Area ea on srl.cMatArea=ea.cGUID
left join ST_MatPosition mp on srl.cGUID = mp.cStkLineID
left join cm_customer cc on  sr.cCustGUID =cc.cGUID
where
     iAuditStatus='1' and
             srl.iOutQTY<srl.iQTY and
         sr.cBusType='04001' and
                 cStkOutLineStatus='0' and

                 sr.cCustGUID ='533411669541064724' and
                 sr.cStoreGUID = '533411669541001619'
红色是固定条件
蓝色是动态 
如何优化 查询 目前五六万属于 查询需要十几秒 求高手支招
若建立索引如何建立。

解决方案 »

  1.   

    1. where 中的所有判断条件,放到各自的join段落,所有使用到的列都建立索引,主键列已有自动索引,不需要建立。只把主表的条件放在where中2. 如果关联唯一,使用inner join。
      

  2.   


    select top 9999999
    srl.cGUID,
    srl.cMatGUID,
    srl.cMatArea,
    srl.cReelNum,
    srl.cUnitGUID,
    cast(srl.iQTY as decimal(21,3)) as iQTY,
    cast((srl.iQTY-srl.iOutQTY) as decimal(21,3)) as iCurQuan,
    srl. cMUnitGUID,
    cast(srl.iUnitQTY as decimal(21,3)) as iUnitQTY,
    srl.cRe,
    sr.cBillCode,
    CONVERT(varchar(100),sr.dDate, 23) as dDate,
    cm.cMatCode,
    cm.cMatName,
    cm.cSpec,
    cu.cName as cUnitName,
    cMu.cName as cMUnitName,
    ea.cName as cMatAreaName,
    cc.cName as cCustName,
    srl.cDefine7 as cDefine7,
    srl.cDefine9 as cDefine9,

    mp.cPositionGUID,cm.cDefine1
    from JSHX_EM_StkRecordLine srl
    left join JSHX_EM_StkRecord sr on srl.cHeadGUID=sr.cGUID
    left join CM_Material cm on srl.cMatGUID=cm.cGUID
    left join CM_Unit cu on srl.cUnitGUID = cu.cGUID
    left join CM_Unit cMu ON srl.cMUnitGUID = cMu.cGUID
    left join JSHX_EM_Area ea on srl.cMatArea=ea.cGUID
    left join ST_MatPosition mp on srl.cGUID = mp.cStkLineID
    left join cm_customer cc on  sr.cCustGUID =cc.cGUID
    where
         iAuditStatus='1' and
                 srl.iOutQTY<srl.iQTY and
             sr.cBusType='04001' and
                     cStkOutLineStatus='0' and
                     sr.cCustGUID ='533411669541064724' and
                     sr.cStoreGUID = '533411669541001619' 
      

  3.   

    1、top 9999999 是干嘛的?
    2、检查where里面的字段是否有索引?
    你有装SQLServer Management studio吗?用那个生成执行计划好看点,你这个实在看不懂
      

  4.   

    3L的方法可以参照,关联尽量用inner join,
    如果用inner join可以将where中的筛选条件放到on处
    --------------
    然后on中的所有关联条件要建立索引,where中的筛选列要建立索引
    select列表视情况而定,可以考虑覆盖索引
      

  5.   

    这个执行计划平生第一次见,看不懂
    生成一个txt的看看
      

  6.   

    除了 srl.iOutQTY和srl.iQTY 外
    其他0楼所提的所有字段都有索引了吗?
      

  7.   

    楼主简化的手段多种多样。在系统规划阶段就必须考虑如何避免复杂查询。一个不好的设计会使你不得不在无数表之间进行多次交叉连接才能得到数据,这大大降低了性能。常见的简化规则如下:
     
    1)不要有超过5个以上的表连接(JOIN)
    2)考虑使用临时表或表变量存放中间结果。
    3)少用子查询
    4)视图嵌套不要过深用临时表存放中间结果集试试
      

  8.   

    CM_Material(cGUID )
    ST_MatPosition(cStkLineID)
    需要索引你的图不够全,更重要的没有看到总体来说,你的所有关联字段没有索引,所以出现很多聚集索引扫描或者表扫描
    left join JSHX_EM_StkRecord sr on srl.cHeadGUID=sr.cGUID
    应该改成
    inner join JSHX_EM_StkRecord sr on srl.cHeadGUID=sr.cGUID
      

  9.   

    最重要的应该是
    JSHX_EM_StkRecordLine srl、JSHX_EM_StkRecord
    这两个表在where出现的字段没有索引(看图好像是聚集索引扫描),加上索引速度会有数量级的提高
      

  10.   

    iAuditStatus='1' and                 
    cStkOutLineStatus='0' and
    这两个字段哪个表的
    在JSHX_EM_StkRecordLine srl、JSHX_EM_StkRecord
    这两个表根据使用的字段建立组合索引,重复率低的字段排在前面
    另外,这两个表需要关注数据量,数据量大的索引才有效果
      

  11.   

    用DTA(数据库引擎顾问),把你的查询丢里面去分析好了。
    http://blog.csdn.net/dba_huangzj/article/details/7643763
      

  12.   

     srl.cStkOutLineStatus='0'
     sr.iAuditStatus='1'
      

  13.   


    srl.cStkOutLineStatus='0'
    这个条件的记录有多少
    srl.cStkOutLineStatus有无索引
      

  14.   


    srl.cStkOutLineStatus='0'占大部分
    cStkOutLineStatus
      

  15.   

    这个索引没起到作用,应该删除
    最好增加一个字段(sql server可以用计算字段,也可以考虑触发器维护这个字段)存放iQTY - iOutQTY的值,并建立索引,查询条件改为  这个字段 > 0
      

  16.   

    srl.cHeadGUID有无索引iAuditStatus='1' and
    sr.cBusType='04001' and
    sr.cCustGUID ='533411669541064724' and
    sr.cStoreGUID = '533411669541001619'这四个字段都重复率很高吗,怎么全部是扫描,考虑建立一个四字段的组合索引