1

I indizierte Sicht erstellt (gruppierten eindeutigen Index für Table1_ID) Ansicht mit einem solchen T-SQL:Verständnis indizierte Sicht Update qnd Abfrageprozess in SQL Server 2008 R2

Select Table1_ID, Count_BIG(*) as Table2TotalCount from Table2 inner join 
Table1 inner join... where Table2_DeletedMark=0 AND ... Group BY Table1_ID 

Auch nach der Erstellung der Ansicht, setzen wir einzigartige geclusterte Index für Spalte Table1_ID. ein schwer ist, weil die Gruppe durch und mehrere Millionen von Zeilen in Tabelle 2

Table1_ID 
Table2TotalCount 

T-SQL-Code für Ansicht zu erstellen:
So Ansicht besteht aus zwei Spalten.

Aber wenn ich eine Anfrage an eine Ansicht wie

Select Total2TotalCount from MyView where Table1_ID = k 

laufen - es führt schnell und ohne Aufwand für Server.

Auch in t-sql zum Erstellen von Ansicht viele Bedingungen in Where-Klausel für Table2 Spalten. Und Wenn ich geändert Table2_DeletedMark 1 und führen eine Abfrage

Select Total2TotalCount from MyView where Table1_ID = k 

wieder - ich werde korrekte Ergebnisse erhalten. (Table2TotalCount um 1 verringert).

Also unsere Fragen sind:
1. Warum Abfrageausführungszeit verringert, so viel, wenn wir indizierte Sicht verwendet (um ohne Ansicht vergleichen mit (selbst laufen wir DBCC DROPCLEANBUFFERS() vor Ausführung der Abfrage zu sehen))
2. Nach dem Ändern

Table2_DeletedMark 

Ansicht sofort neu berechnet und wir bekommen korrekte Ergebnisse, aber was ist der Prozess dahinter? Wir können uns nicht vorstellen, dass sql t-sql ausführt, indem die Ansicht jedes Mal generiert wird, wenn wir Werte von 10 Spalten, die in der t-sql-Ansicht enthalten, ändern, weil sie zu schwer ist.
Wir verstehen, dass es ausreicht, eine einfache Abfrage auszuführen, um Werte neu zu berechnen, abhängig von Spaltenwerten, die wir ändern.
Aber wie versteht es SQL?

Antwort

2

Eine indizierte Sicht ist materialisiert z.B. seine Zeilen, die es enthält (von den Tabellen abhängig) sind physikalisch gespeichert auf der Festplatte - ähnlich wie eine "System-berechnete" Tabelle, die immer auf dem neuesten Stand gehalten wird, wenn die zugrunde liegenden Tabellen ändern. Dies geschieht durch Hinzufügen des gruppierten Index - die Blattseiten des gruppierten Index in einer SQL Server-Tabelle (oder Sicht) sind die Datenseiten, wirklich.

Spalten in einer indizierten Sicht können auch mit nicht gruppierten Indizes indiziert werden. Dadurch können Sie die Abfrageleistung noch weiter verbessern. Der Nachteil ist: Da die Zeilen gespeichert sind, benötigen Sie Speicherplatz (und einige Daten sind natürlich doppelt vorhanden).

Eine normale Sicht hingegen ist nur ein Fragment von SQL, das ausgeführt wird, um die Ergebnisse zu berechnen - basierend darauf, was Sie aus dieser Sicht auswählen. Es gibt keine physische Darstellung dieser Ansicht. Es werden keine Zeilen für eine normale Ansicht gespeichert. Sie müssen bei Bedarf aus den Basistabellen zusammengesetzt werden.

+0

Ich verstehe, dass die indizierte Sicht materialisiert ist. Die Hauptfrage ist unsere zweite Frage. Ich frage mich, ob ein Mechanismus funktioniert, der "immer dann aktualisiert wird, wenn sich die zugrunde liegenden Tabellen ändern". Wie es funktioniert ? Können Sie erklären, Frage 2 –

+0

@ mmcteam.com.au: anders als jemand aus dem SQL Server-Team, ich glaube nicht, dass jemand wirklich im Detail erklären kann, wie das funktioniert. Ich weiß einfach, dass es funktioniert - die indizierte Sicht wird immer dann aktualisiert, wenn eine der zugrunde liegenden Tabellen geändert wird. Das ist alles, was ich selbst wissen muss :-) –

0

Warum denken Sie, dass es so viele bizarre Regeln darüber gibt, was in indizierten Sichten erlaubt ist und was die Basistabellen tun dürfen?So kann die SQL-Engine sofort erkennen: "Wenn ich diese Zeile berühre, beeinflusst dies möglicherweise das Ergebnis dieser Ansicht. Sehen wir mal, diese Zeile passt nicht mehr zu den Ansichtskriterien, aber ich bestand darauf, COUNT_BIG (*) zu haben. also kann ich diesen Wert einfach um eins verringern. "

Verwandte Themen