如何使用CSV列加速此组?

时间:2014-01-27 22:08:34

标签: sql sql-server performance sql-server-2005 group-by

我有一张简单的表:create table breaktypes (parent_id int, child_id int)。数据基本上是这样的:

parent_id child_id
125       1
125       3
125       19
125       3722
126       32
126       44
126       13
126       14
127       266

基本上是一个parent_id值列表,其中包含属于它的child_id值。我希望数据以下面的方式返回...基本上是一个带有逗号分隔的child_id值列表的parent_id。

parent_id child_id_csv
125       1,3,19,3722
126       32,44,13,14
127       266

所以我得到了以下内容并且有效:

SELECT  parent_id ,
        (   SELECT    CAST(bt2.child_id AS VARCHAR(5)) + ','
            FROM      dbo.breakTypes bt2
            WHERE     bt2.parent_id = bt1.parent_id
            FOR XML PATH('')
        ) AS child_id_csv 
FROM    breaktypes bt1
GROUP BY bt1.parent_id

这似乎可行,但速度太慢了。该表包含1000万条记录,需要105秒才能恢复。而且只需要调用select parent_id, child_id from breaktypes并在18秒内获得所有内容(但带宽成本很高)。

如何加快查询速度?

1 个答案:

答案 0 :(得分:1)

我怀疑select查询每行都运行一次,而不是每个父运行一次。您可以尝试在子查询中执行distinct

SELECT  parent_id ,
        (   SELECT    CAST(bt2.child_id AS VARCHAR(5)) + ','
            FROM      dbo.breakTypes bt2
            WHERE     bt2.parent_id = bt1.parent_id
            FOR XML PATH('')
        ) AS child_id_csv 
FROM  (select distinct parent_id
       from breaktypes
      ) bt1;