Verketten Sie ein Feld nach dem GROUP BY

Diese Frage schon oft gefragt in SO aber keine der Antworten ist zufriedenstellend zu meiner situation.

  1. Frage 1
  2. Frage 2
  3. Frage 3
  4. Frage 4

Ich bin den Umgang mit einer DataObjectVersions Tabelle mit mehreren Versionen für rund 1,2 Millionen einzigartige Objekte (und Steigend). Ich muss zum verketten von änderungen aus einem bestimmten Feld für jedes einzelne Objekt.

Recht, jetzt bin ich mit der Lösung mit der XML-Pfad präsentiert in Q3 aber läuft wie eine Abfrage auf diese Tabelle wird ein Gesamt-Leistung Katastrophe. SQL Server begann die Rückfahrt Daten nach 19mn. Zu wissen, dass diese Daten als kam Sie zweimal, Sie können sich vorstellen, die Auswirkungen.

Ich bin auf der Suche für die meisten effiziente Skalierbarkeit-aware Weg zu verketten Sie die Werte der gleichen Felder der verschiedenen Reihen gruppiert, die von einem anderen Feld (die natürlich nicht ein-Taste). Um genauer zu sein, ist dies innerhalb einer Ansicht in ein data Warehouse.

EDIT:

Ich habe versucht, zur Vereinfachung der Beschreibung, aber hier ist die komplette übersicht
Ich habe mehrere Tabellen mit den folgenden Spalten

 [ID] 
[CreatedTime] 
[CreatedBy] 
[DeletedTime] 
[DeletedBy] 
[ResourceId] 
[AccountId] 
[Typ] 

Blick zurück, die union der alle Datensätze aus allen Tabellen, die wird noch wieder den gleichen Spalten (siehe meine Fragen durch die versions-Tabelle). [ResourceId] und [AccountId] sind eine einzigartige zusammengesetzte Bezeichner eines Objekts (Mitgliedschaft in der Gruppe, System, account, etc.. eine Ressource-Zuordnung genau zu sein). Die [Type] wird verwendet, um zu identifizieren, die verschiedenen Ebenen (wie Lesen/Schreiben/Ausführen in dem Fall eines Datei-Zuordnung)

Alle anderen Felder enthalten die gleichen Werte (in verschiedenen Tabellen) für verschiedene, einzigartige Objekte. Ich brauche, um die Objekte und verketten Sie die Werte der [Type] Spalte. Alle Zeilen verarbeitet werden, und danach die ( [ResourceId] ,[AccountId]) - Kombination muss eindeutig sein (nicht der Fall bei verschiedenen Arten vorhanden sind).

EDIT 2:

Bin ich mit dieser Funktion:

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 ist der Ansicht Rücksendung der union aller Tabellen-Zeilen.

Schließlich bin ich die Auswahl

SELECT [CreatedTime]
      ,[DeletedTime]
      ,[DeletedBy]
      ,[ResourceId]
      ,[AccountId]
      ,dbo.GetUniqueType([ResourceId],[AccountId]) AS [Type]
FROM vwAllAssignments
GROUP BY [ResourceId], [AccountId], [CreatedTime], [DeletedTime], [DeletedBy]
  • Meinst du etwas wie "Objekt", "V1, V2, V3, V4"?
  • Ja, aber für eine bestimmte Spalte nur nicht alle Spalten wie die Verkettung von Arten oder ändern von Daten aus verschiedenen Versionen
  • Bitte zeigen Sie Ihre Datenbank-layout. Ich benutze concatenation in SQL Server 8 auf größeren Tischen und erhalten Sie viel bessere Leistung. Ich vermute, einige gut platzierte Indizes zu lösen, wird das performance-problem.
  • bitte posten Sie Ihre vorhandenen code.
  • können Sie setup ein sqlfiddle mit einigen Zeilen von Ihrem vwAllAssignments anzeigen?
  • Wenn die Datenbank verwendet wird, die für OLAP, die stark denormalisierte, konnte Sie store die pre-formatierte Daten in eine Tabelle und dann einfach mit mit es? Sie könnten auch erwägen Sie die Erstellung einer indizierten Sicht gibt die Spalte, insteaf für die Verwendung der Funktion. Hinweis: es kommt auf die Umstände an, aber, nach meiner Erfahrung, die Verkettung der Werte aus mehreren Zeilen in einer einzigen Spalte ist oft eine Präsentation Problem (zum Beispiel, wenn Sie benötigt diese Werte, um Sie anzuzeigen auf einen Bericht), und als solche, sollte es nicht an die Datenbank delegiert.
  • Haben Sie versucht, zu tun, die string-Verkettung direkt in der Feld-Liste und nicht in einer UDF? Ich habe einige Tests und es ist schneller, ohne die UDF.
  • Ich bin am überlegen, dies zu tun als staging-Schritt
  • Ein index, so etwas wie dies wird auch hilfreich sein. create index IX_vwAllAssignments on vwAllAssignments(AccountId, ResourceId, DeletedBy) include(Type)
  • Was meinst du mit UDF? sorry. Ich werde versuchen, den index so gut
  • Die UDF (User Defined Function) ist GetUniqueType ich eine Antwort mit dem code können Sie versuchen.

Schreibe einen Kommentar