2015-05-30 27 views
-2

我有一个工作查询,如下图所示:与组优化SQL查询通过和汇总

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; 

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

+1

我想'FOR XML PATH'会让你的查询速度变慢,如果有可能改变你的方式;)。 –

+1

与WHERE的LIKE比较,查询速度也慢 – Fabio

回答

1

如果你可以改变你的方式,我建议你遵循这一点:

  1. 做一个存储过程
  2. 做一个临时表,用于存储COMP.NSIS和应用c.N like '%searchstring%'它,这将减少数计算SIS
  3. 现在您可以JOINN上的临时表。
  4. 您也可以将JOIN SI更改为LEFT JOIN SI,请注意,如果您的条件超过SI,则会删除NULL值。