Einige Zusammenhänge:
Zuerst haben wir Berichte nur "direkt" geschrieben, ohne irgendwelche Sperrhinweise in den Abfragen. Bei den größeren Berichten führte dies manchmal zu Sperrproblemen. Am ersten behoben wir dies durch die Verwendung WITH (NOLOCK)
Hinweis für Tabellen in der Abfrage.
Da (a) es ziemlich aufdringlich ist und (b) es leicht ist, den Hinweis für eine der Tabellen zu vergessen, sind wir zu einer zweiten Annäherungseinstellung TRANSACTION ISOLATION LEVEL
über READ UNCOMMITTED
(was in Ordnung ist) oben in der Abfrage jedes Datensatzes übergegangen.
Wie Sie vielleicht erraten haben, ist es immer noch leicht, den Hinweis für einen der Datensätze zu vergessen. Das führt also zu der Frage:
Frage: Welche Möglichkeiten gibt es, um NOLOCK
Hinweise zusammen mit Berichtsabfragen zu senden ?
PS. Ich weiß , das zu einem gewissen Grad ist ein XY-Problem (mit vielen meinen anderen Optionen für X, wie die Abfrage zu optimieren, nicht auf der operativen Datenbank Berichterstattung zu tun, etc), aber versucht , trotzdem dies eine berechtigte Frage auf mich selbst zu machen .
Optionen:
Hier sind die oben genannten Optionen mit zusätzlichen Optionen, auf die ich gespannt bin, ob sie funktionieren würden:
- Set
WITH (NOLOCK)
Hinweis für jede Tabelle. (aufdringlich, sehr leicht zu vergessen) - Set Isolationsstufe
READ UNCOMMITTED
für die gesamte Abfrage. (immer noch leicht zu vergessen) - Ist es möglich, dies auf Berichtsebene anzugeben ? Stellen Sie beispielsweise sicher, dass alle Dataset-Abfragen für einen Bericht ohne Sperren ausgeführt werden.
- Ist es möglich, dies auf einer anderen SSRS-Ebene anzugeben ? Stellen Sie dies beispielsweise für einen bestimmten Berichtsordner oder mithilfe einer Erweiterung ein?
- Ist es möglich, dies auf der Ebene der Datenquelle / Verbindungszeichenfolge anzugeben ? Haben z. B. alle relevanten Berichte eine bestimmte "No-Lock-Datenquelle" verwendet?
- Bezogen auf die vorherige Option: Vielleicht ist es möglich, einen Standard-Sperrhinweis für einen bestimmten "No-Lock-SQL-Benutzer" (den in der Verbindung verwendeten) anzugeben?
- ???
Welche Optionen sind realisierbar? Gibt es Optionen, die ich verpasst habe?
quelle
Antworten:
Schnelle Antworten:
Es gibt einige Optionen, die sinnvoll sind, wenn die Berichte optimiert sind und dennoch Probleme verursachen:
quelle
Haben Sie über eine
READ_COMMITTED_SNAPSHOT
Zeilenversionierung für die Datenbank nachgedacht ?Kim Tripp hat einen guten Artikel darüber unter http://msdn.microsoft.com/en-us/library/ms345124%28v=sql.90%29.aspx
READ_COMMITTED_SNAPSHOT
Ermöglicht eine bessere Funktionalität als diesWITH (NOLOCK)
, da es eine absolute Zeitpunktkonsistenz für lang laufende Aggregationen oder Abfragen mit erhöhtem Durchsatz bietet, da weniger Sperrenkonflikte auftreten.quelle