【问题标题】:Optimize sql query with group by and aggregate使用 group by 和聚合优化 sql 查询
【发布时间】:2015-05-30 03:47:13
【问题描述】:

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

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() 以获得逗号分隔的聚合。查询很慢。想知道有没有办法优化它?

【问题讨论】:

  • 我认为FOR XML PATH 让您的查询变得如此缓慢,如果可能的话改变您的方式;)。
  • 对比WHERE上的LIKE,查询也慢

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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-29
    • 1970-01-01
    • 2012-12-31
    • 2020-08-23
    • 1970-01-01
    相关资源
    最近更新 更多