这个问题在SO中被多次提出过,但没有一个答案能让我满意。
我正在处理一个DataObjectVersions
表,其中包含大约120万个唯一对象的多个版本(并且正在增加)。我需要为每个唯一对象连接特定字段的更改。
目前我正在使用Q3中提供的XML路径解决方案,但在此表上运行此类查询是一个完全的性能灾难。 SQL Server在19mn之后开始重新调整数据。知道这些数据将被连接两次,你可以想象这种影响。
我正在寻找最有效的可伸缩性感知方法来连接由其他字段(当然不是密钥)分组的不同行的相同字段的值。更准确地说,这是在Datawarehouse的视图中使用的。
修改
我试图简化描述,但这里是一个完整的概述 我有多个表,包含以下列
[ID] [CreatedTime] [CreatedBy] [DeletedTime] [DeletedBy] [ResourceId] [AccountId] [Type]
视图用于返回所有表中所有记录的并集,这些记录仍将返回相同的列(在我的问题中由versions表中描述)。 [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 :(得分: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)