この質問はSOで何度も尋ねられましたが、私の状況に満足できる答えはありません。
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]