Indizierte Sicht und T-SQL, die gleichen Ergebnisse wie DISTINCT in SQL Server 2008 R2 geben
-
11-10-2019 - |
Frage
Ich möchte indizierte Sicht erstellen MyView mit einem solchen T-SQL
Select
o.Theme_ID as Theme_ID,
DATEADD(day, DATEDIFF(day, 0, o.Object_CreationDate), 0) as Objext_CreationDate,
Count_BIG(*) as ObjectCount, o.Object_Tonality from [dbo].Object o
inner join [dbo].Theme t on o.Theme_ID = t.Theme_ID
inner join [dbo].[ThemeWorkplace] tw on t.Theme_ID = tw.Theme_ID
inner join [dbo].Workplace w on w.Workplace_ID = tw.Workplace_ID
... where t.Theme_DeletedMark = 0
AND (w.Workplace_AccessType = 1 OR w.Workplace_AccessType = 8)
AND Object_DeletedMark = 0 ...
Group BY o.Theme_ID,o.Object_Tonality, DATEADD(day, DATEDIFF(day, 0, o.Object_CreationDate), 0)
Dieses T-SQL funktioniert gut und ermöglicht auf einen gruppierten Index auf MyView .
Das Problem ist, dass Tabelle ThemeWorkplace
mehrere Datensätze mit gleichem Theme_ID
enthält.
Und auch ich GROUP BY
verwenden - ich in Object_Count
Wert,
entspricht: (real Object_Count
Wert) * count (Theme_ID
in ThemeWorkplace
).
Ich kann nicht DISTINCT
Wort in T-SQL, weil in diesem Fall benutze es unmöglich ist, Index auf Sicht zu erstellen.
Was ist ein Vorschlag korrekte Ergebnisse aus meiner Sicht zu bekommen?
Lösung
Wie Sie bemerkt haben, gibt es erhebliche Einschränkungen für eine indizierte Sicht zu schaffen. Die Techniken, die Ihnen dabei helfen können, wie zum Beispiel verschiedenen oder eine Unterabfrage sind verboten. Ich denke, Sie werden in diesem speziellen Fall materialisieren die Ansicht opfern müssen.