1, join的字段建立索引
2, 小计用rollup

解决方案 »

  1.   

    join on 条件的两端字段,最好都在各自的表里有对应的索引
      

  2.   

    就是那些用来连接的字段,可以先建几个看看,特别是表数据量大的那些表的字段。
    另外,你上下两个GROUP BY 后跟的字段都不一样,不能用with rollup。
      

  3.   

    9楼说的没错,我刚试了一下,只能通过索引来优化了。
    SELECT
        case when grouping(CompanyName=1) then '小计' end project, 
        G.CompanyName AS ClientName, 
        E.CompanyName AS WhName, 
        F.WhPosition, 
        B.GoodsNum,
        B.GoodsName,
        B.GoodsSpec, 
        C.DictName AS GoodsUnit,
        A.WhPos,
        A.ProdDate,  
        A.SerialNum,
        D.DictName AS GoodsStatus,
        A.WareHouseNo,
        SUM(A.IOCount / C.MaxConverRate) AS StoreCount 
    FROM tb_Wh_AccountBook A  
        INNER JOIN tb_Bas_ClientGoods B ON A.GoodsGuid = B.GoodsGuid  
        INNER JOIN vw_Bas_GoodsUnit C ON B.GoodsUnitGuid = C.GoodsUnitGuid And B.GoodsGuid=C.GoodsGuid  
        INNER JOIN tb_Sys_Dict D ON A.StatusGuid = D.DictGuid  
        INNER JOIN tb_Bas_Company E ON A.WhGuid = E.CompanyGuid  
        INNER JOIN tb_Wh_Position F ON A.WhNumGuid = F.WhPosGuid  
        INNER JOIN tb_Bas_Company G ON A.ClientGuid = G.CompanyGuid 
    GROUP BY 
        G.CompanyName,
        E.CompanyName,
        F.WhPosition,
        B.GoodsNum,
        B.GoodsName,
        B.GoodsSpec, 
        C.DictName,
        A.WhPos,
        A.ProdDate,
        A.SerialNum,
        D.DictName,
        A.WareHouseNo 
    with rollup
    having SUM(A.IOCount / C.MaxConverRate)>0 
    order by 
        ClientName,
        WhName,
        WhPosition,
        GoodsNum, 
        GoodsUnit,
        project,
        WhPos--建立索引 create index indexname on tb(col1,col2...)消息 1027,级别 15,状态 1,第 36 行
    GROUP BY 子句中指定的表达式太多。当指定了 CUBE 或 ROLLUP 时,表达式的最大数目为 10。
      

  4.   

    union 
    -->
    union all
      

  5.   

    表排序小表 inner join 中表 
         inner join 大表
    以此类推 另外加索引 
      

  6.   

    建一个小计表,一行数据,在对
    tb_Wh_AccountBook    tb_Bas_ClientGoods  vw_Bas_GoodsUnit  tb_Sys_Dict  tb_Bas_Company  tb_Wh_Position  tb_Bas_Company 
    这些表更新数据的时候进行一下 update
     '小计', G.CompanyName, E.CompanyName, F.WhPosition,B.GoodsNum, B.GoodsName, B.GoodsSpec,  
          C.DictName,null,null, null,null,null, SUM(A.IOCount / C.MaxConverRate) 
    再执行你的查询时间可以缩短一半.
      

  7.   

    join这么多表还聚合?以前追求的是一条语句实现功能, 现在做的越多,发现这种做法越错。要聚合的表,尽可能先聚合, 然后插入临时表, 这样行数可能成倍减少。接下来,用临时表的中间结果 再与其它表连接。 如果要连接的表太多,可以考滤生成多次中间结果集,再连。好与不好,自己试过就知道。
      

  8.   

    使用临时表会产生磁盘写入,会不会影响性能?
    总是使用表变量来代替临时表,但是表变量没有索引(只有一个主键)。
    不知道sqlserver对于中间的子查询,会不会自动建立临时的索引?
      

  9.   


    使用临时表会产生磁盘写入,会不会影响性能? 
    1.有,,不会很大,写入的也很快的。
    总是使用表变量来代替临时表,但是表变量没有索引(只有一个主键)。
    2.没必要用表变量,数据稍微多点你的内存就怕吃紧了。
    不知道sqlserver对于中间的子查询,会不会自动建立临时的索引?
    3.还是用临时表,临时表是可以建立索引的。
    CREATE NONCLUSTERED INDEX IDX_TempCol1 ON #TMP(Col1) 
      

  10.   


    简单的说一次全部join和  放临时表再join几次 二者之间的区别:join几次放临时表再join  避开了一次全部join 时的io峰值。道理跟 一条update语句去更新 一个 1000w 的数据表一样
    可以写循环 每 1w行更新一次。