2014-06-16 32 views
0

我在使用Sub查询时遇到了问题,当我的表中有很多记录时,我的SQL变慢了很多。我只是想知道是否a)我正确地做到了,或b)有另一种做我想做的事情的方式。有没有比在SQL中使用FOR XML更好的选择

[人物]

ID | Name 
------------ 
1 | Bob  
2 | Tom 

[宠物]

ID | Category 
---------------- 
1 | Cats 
2 | Dogs 
3 | Snakes 

[PeoplePets]

PeopleID | PetID 
------------------- 
    1  | 2 
    1  | 3 
    2  | 1 
    2  | 2 

查询

Select Name, 
STUFF((SELECT ', ' + Category FROM PeoplePets PP 
INNER JOIN Pets P ON P.ID=PP.PetID FOR XML PATH('')), 1, 2, '') AS PersonsPets 
FROM People 

结果

Name | PersonsPets 
--------------------- 
Bob | Dogs, Snakes 
Tom | Cats, Dogs 

确定这是什么,我有一个非常简单的版本,但我不知道这是否是这样做的最佳或唯一办法?

为一个表我有大约30000条记录,当我返回前300时,只使用一个子查询可能需要大约3秒,当我添加更多的子查询的它变得更慢。因此,本质上我只是试图对类别进行分组(最多可以有10个不同的类别),并将数据列从列中移出。

+0

这取决于。 *为什么*你使用这种技术?对于报告? – podiluska

+0

@podiluska是的,我需要输出数据给用户。 –

+0

你怎么生成这个报告 – podiluska

回答

2

函数stuff()不会减慢查询速度。子查询正在放慢速度。

这是您的查询:

Select Name, 
     STUFF((SELECT ', ' + Category 
       FROM PeoplePets PP INNER JOIN 
        Pets P 
        ON P.ID = PP.PetID 
       FOR XML PATH('') 
      ), 1, 2, '' 
      ) AS PersonsPets 
FROM People; 

我看到外部查询没有相关性,所以我觉得还是做了很多的工作 - 和生产上的每一行相同的列表。你应该首先尝试这样的事:

Select Name, 
     STUFF((SELECT ', ' + Category 
       FROM PeoplePets PP INNER JOIN 
        Pets P 
        ON P.ID = PP.PetID 
       WHERE People.ID = PP.PeopleID 
       FOR XML PATH('') 
      ), 1, 2, '' 
      ) AS PersonsPets 
FROM People; 

其次,你应该确保所有的id列索引,以及PeoplePets(PeopleId, PetId)

+0

啊,我错过了那里的那个地方。这是一个漫长的星期一:| –

+0

所以答案是否定的,没有其他办法可以做我想做的事。哦,回到绘图板。感谢您的回复:) –

相关问题