3

この質問はSOで何度も尋ねられましたが、私の状況に満足できる答えはありません。

  1. 質問1
  2. 質問2
  3. 質問 3
  4. 質問 4

DataObjectVersions約 120 万の一意のオブジェクト (および増加中) の複数のバージョンを含むテーブルを扱っています。一意のオブジェクトごとに特定のフィールドからの変更を連結する必要があります。

現在、第 3 四半期に提示された XML パスを使用してソリューションを使用していますが、このテーブルでこのようなクエリを実行すると、全体的なパフォーマンスが低下します。SQL Server は 19 分後にデータを返し始めました。このデータが 2 回結合されることを知っていると、その影響を想像できます。

他のフィールド (もちろんキーではありません) でグループ化された異なる行の同じフィールドの値を連結する最も効率的なスケーラビリティを意識した方法を探しています。より正確には、これはデータ ウェアハウスのビュー内で使用されます。

編集:

説明を簡略化しようとしましたが、ここに完全な概要があります。次の列を持つ複数のテーブルがあります

   【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 に答える