2009-07-06 12 views
4

Lassen Sie uns sagen, dass ich eine SQL Server indizierte Sicht haben, vwIndexedView, die aus zwei Tabellen liest, tbTableOne und tbTableTwo.Indizierte Sichten aktualisieren während einer Transaktion?

Wenn ich eine Aktion an einer der beiden Tabellen innerhalb einer Transaktion durchführe, was passiert dann mit meiner indizierten Sicht? Wird es sofort aktualisiert oder muss ich meine Transaktion bestätigen, bevor die Ergebnisse angezeigt werden?

Zum Beispiel:

BEGIN TRANSACTION testTransaction 
INSERT INTO tbTableOne VALUES ('1', '2') 
SELECT * FROM vwIndexedView 
COMMIT TRANSACTION 

SELECT * FROM vwIndexedView 

Würden die Ergebnisse der ersten SELECT anders sein als die zweite?

Antwort

9

Ein Index oder eine indizierte Sicht wird sofort als Teil der DML-Anweisung, die das Update durchführt, aktualisiert. In Ihrem Fall, wenn Sie den tatsächlichen Ausführungsplan des INSERT analysieren, sehen Sie, dass er Operatoren für die Aktualisierung aller physischen 'Partitionen' enthält, und Ihre indizierte Sicht ist eine dieser Partitionen.

0

Ist das eine zentral umkämpfte Tabelle? I.E indem Sie es für den Einsatz in der Transaktion sperren, werden Sie dafür sorgen, dass Tonnen anderer Spids warten?

Die einfache Antwort ist ja, die Views werden mit den neuen Werten aktualisiert, aber dies wird einige Performance-Kopfschmerzen verursachen, an die Sie auch denken sollten, wenn Sie andere Orte in diese zugrunde liegenden Tabellen einfügen.

2

Indexierte Ansichten werden sofort aktualisiert, Sie können sich den Ausführungsplan ansehen und selbst sehen. Dies führt zu vielen Sperrkonflikten: be ready to drop your indexed view

Verwandte Themen