Eingespeicherte Antwort :
In allzu vielen Fällen kann eine indizierte Sicht Ihre kurzfristigen Leistungsziele lösen, wird aber zu einem späteren Zeitpunkt kontraproduktiv. Wenn Sie sich für eine indizierte Sicht entscheiden, benötigen Sie möglicherweise eine Exit-Strategie. Lassen Sie mich ein paar häufige Probleme mit indizierten Sichten beschreiben.
Indizierte Ansichten können die Sperrenkonflikte erhöhen.
Es ist sehr einfach zu demonstrieren. Erstellen Sie die folgende Tabelle:
%Vor%
Führen Sie auf einer Registerkarte in SSMS das folgende Skript aus:
%Vor%
Führen Sie auf einer anderen Registerkarte eine ähnliche aus:
%Vor%
Beachten Sie, dass beide Einfügungen abgeschlossen sind, sie blockieren sich nicht gegenseitig. Rollback in beiden Registerkarten und erstellen Sie eine indizierte Sicht:
%Vor%
Führen Sie die zwei Inserts erneut aus. Beachten Sie, dass der zweite nicht abgeschlossen wird; Es ist blockiert. Der Grund ist sehr einfach: Die erste Einfügung ändert den entsprechenden Eintrag in der indizierten Sicht, so dass die Einfügung eine Sperre erhält und hält.
Es ist genauso einfach zu demonstrieren, dass beim Erstellen einer indizierten Sicht möglicherweise auch Deadlocks wahrscheinlicher werden.
Hinweis: Dies ist kein Problem bei der Implementierung indizierter Sichten. Wenn Sie eine eigene Übersichtstabelle einrichten und Trigger entwickeln, die sie direkt ändern, um sie auf dem neuesten Stand zu halten, werden Sie auf dasselbe Problem stoßen. Nur wenn Sie Ihre Übersichtstabelle nicht ständig pflegen, können Sie dieses Sperrproblem umgehen, aber eine ausführlichere Diskussion darüber würde den Rahmen dieses Beitrags sprengen.
Bearbeiten: Das Beispiel mag für Sie künstlich aussehen, aber das Problem, das es zeigt, ist sehr real und sehr häufig. Indizierte Sichten in OLTP-Umgebungen sind von begrenztem Nutzen, da sie die Sperrkonflikte erheblich erhöhen und viele Deadlocks verursachen. Es ist ziemlich üblich, dass jemand sie in OLTP erstellt, aber schließlich abfällt, weil sie mehr Probleme einführen, als sie lösen.
Es gibt zwei gebräuchliche Methoden, um Probleme zu demonstrieren, die durch Parallelität verursacht werden: Entweder schreiben wir Schleifen und führen sie aus mehreren Verbindungen aus oder starten explizit Transaktionen in zwei oder mehr Verbindungen. Ich ermutige jeden dazu, einen einfacheren Weg zu finden, dieses Problem zu demonstrieren.