Concaténer un champ après GROUP BY

Cette question a été posée plusieurs fois dans SO, mais aucune des réponses n'est satisfaisante pour ma situation.

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

J'ai affaire à une table DataObjectVersions qui contient plusieurs versions pour environ 1,2 million d'objects uniques (et qui augmente). J'ai besoin de concaténer les changements d'un champ spécifique pour chaque object unique.

À l'heure actuelle, j'utilise la solution avec le path XML présenté en Q3 mais l'exécution d'une telle requête sur cette table est une catastrophe de performance totale. SQL Server a commencé à retunner datatables après 19mn. Sachant que ces données seront jointes deux fois, vous pouvez imaginer l'impact.

Je suis à la search de la manière la plus efficace d'utiliser l'extensibilité pour concaténer les valeurs des mêmes champs de lignes différentes groupées par un autre champ (ce qui n'est évidemment pas une key). Pour être plus précis, ceci est utilisé dans une vue dans un Datawarehouse.

MODIFIER:

J'ai essayé de simplifier la description mais voici un aperçu complet J'ai plusieurs tables avec les colonnes suivantes

    [ID]
    [CreatedTime]
    [Créé par]
    [DeletedTime]
    [DeletedBy]
    [ResourceId]
    [Identifiant de count]
    [Type]

Une vue est utilisée pour returnner l'union de tous les loggings de toutes les tables, qui returnneront toujours les mêmes colonnes (décrites dans mes questions par la table des versions). [ResourceId] et [AccountId] sont un identifiant composite unique d'un object (appartenance à un groupe, count système, etc.). Le [Type] est utilisé pour identifier différents niveaux (comme Lire / Écrire / Exécuter dans le cas d'une assignation de file)

Tous les autres champs contiennent les mêmes valeurs (dans des tables différentes) pour différents objects uniques. J'ai besoin d'get les objects et de concaténer les valeurs de la colonne [Type] . Toutes les lignes sont traitées par la suite et la combinaison ( [ResourceId] , [AccountId] ) doit être unique (ce qui n'est pas le cas lorsque différents types existent).

EDIT 2:

J'utilise cette fonction:

 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 est la vue qui returnne l'union de toutes les lignes de tables.

Enfin, je sélectionne

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

Essaye ça:

 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] 

Et un index comme celui-ci devrait être utile.

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