2

这个问题在SO中已经问了很多次,但没有一个答案对我的情况满意。在GROUP BY后连接一个字段

  1. Question 1
  2. Question 2
  3. Question 3
  4. Question 4

我处理一个包含多个版本的大约120万唯一对象(增加)DataObjectVersions表。我需要为每个唯一对象连接来自特定字段的更改。

现在我正在使用Q3中提供的XML Path的解决方案,但在此表上运行这样的查询是一个总体性能灾难。 SQL Server在19mn后开始重新调用数据。知道这些数据将会加入两次以上,你可以想象这种影响。

我正在寻找最高效的可伸缩性感知方式来连接由其他字段(当然不是键)分组的不同行的相同字段的值。更确切地说,这是在Datawarehouse的视图中使用的。

编辑:

我试图简化描述,但这里是一个完整的概述 我有多个表与视图用于返回所有的工会下面列

 
    [ID] 
    [CreatedTime] 
    [CreatedBy] 
    [DeletedTime] 
    [DeletedBy] 
    [ResourceId] 
    [AccountId] 
    [Type] 

来自所有表格的记录,这些记录仍然会返回相同的列(在我的问题中由版本表格描述)。 [ResourceId][AccountId]是对象(组成员资格,系统帐户等)的唯一组合标识符。 [Type]用于标识不同的级别(如文件分配时的读/写/执行)

所有其他字段对于不同的唯一对象包含相同的值(在不同的表中)。我需要获取对象并连接[Type]列的值。所有行都在后面处理,并且([ResourceId][AccountId])组合必须是唯一的(不同类型存在时不是这种情况)。

编辑2:

我使用这个功能:

CREATE FUNCTION [dbo].[GetUniqueType] 
(
    @ResourceId as uniqueidentifier, 
    @Account as uniqueidentifier 
) 
RETURNS nvarchar(100) 
AS 
BEGIN 
    return STUFF((select ',' + raType.Type from vwAllAssignments raType where raType.AccountId = @Account and raType.ResourceId = @ResourceId and raType.DeletedBy is null for xml path('')), 1,1,'') 
END 

GO 

vwAllAssignments是返回所有表行的工会的看法。

最后我选择

SELECT [CreatedTime] 
     ,[DeletedTime] 
     ,[DeletedBy] 
     ,[ResourceId] 
     ,[AccountId] 
     ,dbo.GetUniqueType([ResourceId],[AccountId]) AS [Type] 
FROM vwAllAssignments 
GROUP BY [ResourceId], [AccountId], [CreatedTime], [DeletedTime], [DeletedBy] 
+0

你指的是具有类似 “对象”, “V1,V2,V3,V4”? – Diego

+0

是的,但仅适用于特定列,并非所有列如连接类型或更改不同版本的日期 –

+0

请显示您的数据库布局。我在较大的表上使用SQL Server 8中的连接,并获得更好的性能。我怀疑一些放置好的索引将解决性能问题。 –

回答

2

试试这个:

SELECT [CreatedTime] 
     ,[DeletedTime] 
     ,[DeletedBy] 
     ,[ResourceId] 
     ,[AccountId] 
     ,STUFF((select ',' + raType.Type 
       from vwAllAssignments raType 
       where raType.AccountId = vwAllAssignments.AccountId and 
        raType.ResourceId = vwAllAssignments.ResourceId and 
        raType.DeletedBy is null 
       for xml path('')), 1,1,'') AS [Type] 
FROM vwAllAssignments 
GROUP BY [ResourceId], [AccountId], [CreatedTime], [DeletedTime], [DeletedBy] 

而且像这样的指标应该是有帮助的。

create index IX_vwAllAssignments on vwAllAssignments(AccountId, ResourceId, DeletedBy) include(Type) 
+0

比我以前有点好:)谢谢! –

+0

我的意思是更好!数据在20秒后开始返回!并在3mn下完成查询! BRILLIANT –

+0

现在有1,25百万条记录。这很快谢谢你! –