3

这个问题在 SO 中被问过很多次,但没有一个答案能满足我的情况。

  1. 问题 1
  2. 问题2
  3. 问题 3
  4. 问题 4

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

现在,我正在使用 Q3 中提供的 XML 路径的解决方案,但在此表上运行这样的查询完全是性能灾难。SQL Server 在 1900 万之后开始返回数据。知道此数据将比连接两次,您可以想象其影响。

我正在寻找最有效的可扩展性感知方式来连接由其他字段分组的不同行的相同字段的值(这当然不是键)。更准确地说,这是在数据仓库的视图中使用的。

编辑:

我试图简化描述,但这是一个完整的概述我有多个表格,其中包含以下列

   [ID]
   [创建时间]
   [由...制作]
   [删除时间]
   [删除者]
   [资源 ID]
   [帐户ID]
   [类型]

视图用于返回所有表中所有记录的联合,该联合仍将返回相同的列(在我的问题中由版本表描述)。[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]
4

1 回答 1

4

试试这个:

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)
于 2012-11-30T20:02:04.517 回答