使用group by和aggregate优化sql查询

时间:2015-05-30 03:47:14

标签: sql sql-server sql-server-2008 query-optimization

我有一个工作查询,如下所示:

SELECT TOP 1000
    c.B,
    c.N, 
    c.V,
    c.T,
    SIS = stuff((
                SELECT ', ' +  si.S
                FROM
                    COMP com
                    JOIN CCA cca ON com.Cid = cca.CId
                    JOIN CC cc ON cca.Cid = cc.Cid
                    JOIN SI si ON si.SId = cc.SId
                WHERE
                   com.N=c.N

                FOR XML PATH('')), 1, 2, ''
           )
    FROM
    COMP c
    JOIN CCA cca ON c.Cid = cca.CId
    JOIN CC cc ON cca.Cid = cc.Cid
    JOIN SI si ON si.SId = cc.SId
    where c.N like '%searchstring%'
    and si.Sin like '%searchstring%'
    group by c.B, c.N, c.V, c.T
    order by  c.N desc;

它给出了正确的结果。我正在做stuff()来获得逗号分隔的聚合。查询很慢。想知道是否有办法优化它?

1 个答案:

答案 0 :(得分:1)

如果你可以改变你的方式,我建议你这样做:

  1. 制作存储过程
  2. 制作临时表以存储COMP.NSIS并对其应用c.N like '%searchstring%',这将减少计算SIS的数量。
  3. 现在,您可以JOIN N上的{临时表} JOIN SI。{/ 1}
  4. 您也可以将LEFT JOIN SI更改为SI,请注意,当条件超过NULL时,它会删除read_int个值。