Wie erstelle ich materialisierte Ansichten in SQL Server?

101

Ich werde eine DW entwerfen und habe von materialisierten Ansichten gehört. Eigentlich möchte ich eine Ansicht erstellen und sie sollte automatisch aktualisiert werden, wenn Basistabellen geändert werden. Kann mir jemand mit einem Abfragebeispiel erklären ..

Deepak
quelle

Antworten:

144

In SQL Server werden sie als indizierte Ansichten bezeichnet. Weitere Hintergrundinformationen finden Sie in diesen Whitepapers:

Grundsätzlich müssen Sie nur Folgendes tun:

  • Erstellen Sie eine reguläre Ansicht
  • Erstellen Sie einen Clustered-Index für diese Ansicht

und du bist fertig!

Der schwierige Teil ist: Die Ansicht muss eine Reihe von Einschränkungen und Einschränkungen erfüllen - diese werden im Whitepaper beschrieben. Wenn Sie dies tun, ist das alles. Die Ansicht wird automatisch aktualisiert, es ist keine Wartung erforderlich.

Zusätzliche Ressourcen:

marc_s
quelle
Danke für deine Antwort. Ich habe bekommen, was ich will. Ich würde auch gerne etwas über Indizes wissen. Ich möchte wissen, ob es eine Möglichkeit gibt, ein Sternschemadiagramm in SQL Server zu generieren, wenn ich die gesamte Tabellenstruktur bereit habe. Wenn ja, wie erstelle ich dafür eine Faktentabelle?
Deepak
3
Die Einschränkungen beim Einfügen eines Clustered-Index in die Ansicht sind umfangreich. Beispielsweise kann die Ansicht nicht auf andere Ansichten verweisen und keine äußeren Verknüpfungen enthalten. Daher können viele Ansichten, die eine bessere Leistung benötigen, diese Methode nicht verwenden. Immer noch eine gute Antwort.
Jeff Wilson
1
Wie in einer verwandten Frage erwähnt, werden im MSDN-Blogartikel blogs.msdn.microsoft.com/ssma/2011/06/20/… einige der wichtigsten Unterschiede zwischen materialisierten Ansichten und indizierten Ansichten hervorgehoben. Das problematischste IMHO ist, dass keine Aktualisierungsauslöser angegeben werden können: Indizierte Ansichten werden aktualisiert, wenn die Basistabellen aktualisiert werden. Dies untergräbt die meisten Leistungsvorteile der Verwendung einer materialisierten Ansicht. Durch Verbote für Verknüpfungen, Aggregate, Fensterfunktionen und Unterabfragen sind indizierte Ansichten nahezu sinnlos, es sei denn, die Daten ändern sich nicht häufig.
Suncat2000
43

Obwohl nur aus technischer Sicht, klingen indizierte Ansichten wie etwas, mit dem jeder die Leistung verbessern könnte, aber das reale Szenario ist sehr unterschiedlich. Es ist mir nicht gelungen, indizierte Ansichten dort zu verwenden, wo ich sie am dringendsten benötige, da zu viele Einschränkungen bestehen, was indiziert werden kann und was nicht.

Wenn Sie in den Ansichten äußere Verknüpfungen haben, können diese nicht verwendet werden. Außerdem sind allgemeine Tabellenausdrücke nicht zulässig. Wenn Sie in Unterauswahlen oder abgeleiteten Tabellen (z. B. mit partition by-Klausel) eine Reihenfolge haben, haben Sie ebenfalls Pech.

Das lässt nur sehr einfache Szenarien übrig, um indizierte Ansichten zu verwenden. Meiner Meinung nach kann etwas optimiert werden, indem ohnehin geeignete Indizes für zugrunde liegende Tabellen erstellt werden.

Ich werde begeistert sein, einige reale Szenarien zu hören, in denen Menschen tatsächlich indizierte Ansichten zu ihrem Vorteil verwendet haben und ohne sie nicht hätten auskommen können

Rajiv
quelle
Eigentlich habe ich indizierte Ansichten (nur einmal) verwendet, um einen Volltextsuchindex zu partitionieren. FTS-Indizes können zwar nicht partitioniert werden, es können jedoch separate Indizes für mehrere Ansichten aus derselben Tabelle erstellt werden. Es war jedoch eine Art letzter Ausweg.
Areyesram
4
Sie müssen daran denken, (NOEXPAND)den Abfragen, die die indizierten Ansichten verwenden , einen Hinweis hinzuzufügen . Und dann merkt man den Unterschied. Der Vorteil der Verwendung der indizierten Ansichten gegenüber der "ordnungsgemäßen Indizierung der Tabellen" besteht darin, dass die Datensatzauswahl eingeschränkt wird. Andernfalls ist dies derselbe.
Ajeh
Ja, das NOEXPAND-Ding ist nicht zu unterschätzen!
Simon_Weaver
18

Möglicherweise benötigen Sie etwas mehr Hintergrundinformationen darüber, was eine materialisierte Ansicht tatsächlich ist. In Oracle ist dies ein Objekt, das aus einer Reihe von Elementen besteht, wenn Sie versuchen, es an anderer Stelle zu erstellen.

Ein MVIEW ist im Wesentlichen eine Momentaufnahme von Daten aus einer anderen Quelle. Im Gegensatz zu einer Ansicht werden die Daten nicht gefunden, wenn Sie die Ansicht abfragen. Sie werden lokal in einer Tabellenform gespeichert. Die MVIEW wird mithilfe einer Hintergrundprozedur aktualisiert, die in regelmäßigen Abständen oder bei Änderungen der Quelldaten gestartet wird. Oracle ermöglicht vollständige oder teilweise Aktualisierungen.

In SQL Server würde ich Folgendes verwenden, um eine grundlegende MVIEW zu erstellen, die regelmäßig (vollständig) aktualisiert wird.

Zunächst eine Ansicht. Dies sollte für die meisten einfach sein, da Ansichten in jeder Datenbank häufig vorkommen. Als nächstes eine Tabelle. Dies sollte mit der Ansicht in Spalten und Daten identisch sein. Dadurch wird eine Momentaufnahme der Ansichtsdaten gespeichert. Anschließend eine Prozedur, mit der die Tabelle abgeschnitten und basierend auf den aktuellen Daten in der Ansicht neu geladen wird. Schließlich ein Job, der die Prozedur auslöst, um seine Arbeit zu starten.

Alles andere ist Experimentieren.

Jason A.
quelle
5
Ihre Kommentare zu SQL Server sind falsch - materialisierte Ansichten sind in Oracle und SQL Server sehr unterschiedliche Dinge. In SQL Server kann und kann eine Ansicht mit einem eindeutigen Clustered-Index (auch als "materialisierte Ansicht" bezeichnet) vom Benutzer nicht aktualisiert werden. Sie wird auch nicht in einer separaten, vom Benutzer erstellten Tabelle gespeichert. Sie wird immer vom Benutzer aktualisiert Engine während Updates und ist nie nicht synchron. Es muss kein Job zum Speichern eines Schnappschusses der Daten vorhanden sein.
ErikE
10
Was das OP verlangt, kann leicht durch eine indizierte Ansicht bereitgestellt werden. Dies ist das, was SQL Server einer materialisierten Oracle-Ansicht nativ am nächsten kommt. Wenn Sie jedoch genau die Funktionsweise eines Oracle MVIEW replizieren möchten / müssen, hat Jason Recht. Jasons Ansatz hilft auch in dem gleichen Szenario Oracle msichten kann - zum Beispiel tun , außerhalb der Öffnungszeiten einer Berichtstabelle aktualisieren , wo Sie mehr über die Datenbanklast egal als wie bisher auf der Aussicht ist (zB Berichterstattung nur auf dem gestrigen Zahlen ...)
4

Wenn eine indizierte Ansicht keine Option ist und keine schnellen Aktualisierungen erforderlich sind, können Sie eine Hack-Cache-Tabelle erstellen:

select * into cachetablename from myviewname
alter table cachetablename add primary key (columns)
-- OR alter table cachetablename add rid bigint identity primary key
create index...

dann sp_rename view / table oder ändern Sie alle Abfragen oder anderen Ansichten, die darauf verweisen, um auf die Cache-Tabelle zu verweisen.

Planen Sie täglich / abends / wöchentlich / wie nicht erfrischen

begin transaction
truncate table cachetablename
insert into cachetablename select * from viewname
commit transaction

NB: Dies wird Platz verbrauchen, auch in Ihren TX-Protokollen. Am besten für kleine Datensätze geeignet, die nur langsam berechnet werden können. Vielleicht umgestalten, um "einfache, aber große" Spalten zuerst in einer Außenansicht zu entfernen.

stox
quelle
1

Für MS T-SQL Server empfehle ich, einen Index mit der Anweisung "include" zu erstellen. Eindeutigkeit ist nicht erforderlich, ebenso wenig wie die physische Sortierung von Daten, die einem Clustered-Index zugeordnet sind. Der "Index ... Include ()" erstellt einen separaten physischen Datenspeicher, der automatisch vom System verwaltet wird. Es ist konzeptionell einer Oracle Materialized View sehr ähnlich.

https://msdn.microsoft.com/en-us/library/ms190806.aspx

https://technet.microsoft.com/en-us/library/ms189607(v=sql.105).aspx

Scott Nightlinger
quelle