我有一张简单的表: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秒内获得所有内容(但带宽成本很高)。
如何加快查询速度?
答案 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;