2017-07-27 149 views
1

我想列出所有链接到一个特定的“互动”我希望员工与逗号分隔它们一个行中列出的员工,我有工作,但下面的查询很慢。逗号串联结果分隔列表

SELECT 
CONVERT(VARCHAR(254), 
    COALESCE(
     STUFF(
      (
       SELECT 
        ', ' + LTRIM(RTRIM(REPLACE(emp1.Full_Name,CHAR(9),''))) 
       FROM Employee emp1 WITH (nolock) 
       JOIN Rn_Int_Employee rie WITH (nolock) on emp1.Employee_Id = rie.Employee_Id 
       WHERE rnint.Rn_Interactions_Id = rie.Rn_Interactions_Id 
       GROUP BY emp1.Full_Name 
       ORDER BY emp1.Full_Name 
       FOR XML PATH (''),TYPE).value('text()[1]', 'nvarchar(max)'), 1, 2, '') 
     ,STUFF((
      SELECT 
       ', ' + LTRIM(RTRIM(REPLACE(emp1.Full_Name,CHAR(9),''))) 
      FROM Employee emp1 WITH (nolock) 
      WHERE rnint.Rn_Create_User=emp1.Rn_Employee_User_Id 
      GROUP BY emp1.Full_Name 
      ORDER BY emp1.Full_Name 
      FOR XML PATH (''),TYPE).value('text()[1]', 'nvarchar(max)'), 1, 2, ''))) 
     AS Employees  
FROM Rn_Interactions rnint 

有没有人有这样做的更有效的方式提出任何建议?

+0

你可能想尝试codereview.stackexchange.com – JeffUK

+1

发布你的表DDL(包括索引),并添加特定版本的SQL Server的标签。 –

+1

高效?这是一个耗时的查询吗?瓶颈在哪里(看执行计划)? –

回答

0

我检查了您的查询,看到一些有趣的东西:

  • 您与FOR XML PATH抱怨结合使用STUFF作为其中一个是慢执行
  • 你让重复使用的NOLOCK提示
  • JOIN语法

我个人有非常不错的表现串联这些行与使用STUFFFOR XML PATH一个单细胞,你所做的一切,虽然您的最终问题是有可能可以使用一些帮助的结构。我敢打赌,你的索引不能达到标准,纠正这些会让你感到非常满意。

请分享你的执行计划,以便我们可以指出那些出来给你;使用下面的太轻松分享计划:https://www.brentozar.com/pastetheplan/

+0

谢谢 - 该计划是在这里:https://www.brentozar.com/pastetheplan/?id=SkhjeuPL- –

+0

你对'rnint.Rn_Interactions_Id'什么指标? – Eli

+0

我在ID字段有一个聚集索引 –