Wir beheben ein langjähriges Problem mit einem Anbieter. Ihre Software neigt dazu, ein- oder zweimal pro Woche einzufrieren und nicht mehr zu arbeiten, was zu erheblichen Betriebsstörungen führt. Sie konnten die Ursache nicht ermitteln, obwohl wir ihnen viele GB Protokolle und Sicherungen der Datenbank gesendet haben. In letzter Zeit haben sie begonnen, darauf hinzuweisen, dass die Probleme bei unserer Wartung und möglicherweise nicht bei ihrer Software liegen (obwohl es keine lang laufenden Abfragen, keinen CPU / RAM / IO-Druck oder sogar Deadlocks gibt, wenn die Probleme auftreten). Insbesondere sagen sie, dass unsere Indizes ein Problem sind.
Ihr Lieblingswerkzeug ist DBCC Showcontig, obwohl ich argumentiere, dass die Sache von MS abgelehnt wird. Sie sind besonders besessen von der Scandichte und der Fragmentierung. Um die Entschuldigung zu beseitigen, habe ich eine aggressive nächtliche Wartung durchgeführt, bei der Indizes mit einer Scandichte von <90% oder einer Fragmentierung von> 10% neu erstellt werden. Dies hat sie etwas aus dem Scan-Dichte-Zug geworfen, aber sie bleiben auf die Fragmentierung des Ausmaßes fixiert. DBCC showontig zeigt selbst bei einem Index, der Stunden zuvor neu erstellt wurde, eine starke Fragmentierung. Nachfolgend sind die Ergebnisse von dbcc_showcontig und sys.dm_db_index_physical_stats für eine Tabelle aufgeführt, auf die sie als "mögliches Problem" hingewiesen haben.
DBCC SHOWCONTIG
- Gescannte Seiten ................................: 1222108
- Gescannte Bereiche ..............................: 152964
- Extent Switches ..............................: 180904
- Durchschn. Seiten pro Umfang ........................: 8.0
- Scandichte [Beste Anzahl: Tatsächliche Anzahl] .......: 84,44% [152764: 180905]
- Logische Scan-Fragmentierung ..................: 3,24%
- Extent Scan Fragmentation ...................: 35,97%
- Durchschn. Bytes frei pro Seite .....................: 692.5
- Durchschn. Seitendichte (voll) .....................: 91,44%
sys.dm_db_index_physical_stats
index_type_desc alloc_unit_type_desc Avg_fragmentation_in_percent page_count
CLUSTERED INDEX IN_ROW_DATA 3.236803129 1222070
NONCLUSTERED INDEX IN_ROW_DATA 0.680074642 48230
NONCLUSTERED INDEX IN_ROW_DATA 0.093237195 48264
NONCLUSTERED INDEX IN_ROW_DATA 0.03315856 48253
NONCLUSTERED INDEX IN_ROW_DATA 0.194653248 48291
NONCLUSTERED INDEX IN_ROW_DATA 0.393480436 58961
NONCLUSTERED INDEX IN_ROW_DATA 0.23622292 64346
NONCLUSTERED INDEX IN_ROW_DATA 0.041445623 48256
NONCLUSTERED INDEX IN_ROW_DATA 0.701172007 59044
NONCLUSTERED INDEX IN_ROW_DATA 0.216397724 53605
Sollte ich mich mit meinen Indizes befassen? Das obige ist nicht untypisch. Die bevorzugte MS DMV scheint zu zeigen, dass sie in Ordnung ist, aber der Anbieter bleibt bei dieser 35,97% igen Fragmentierung. Ich vermute, dass sie nur verzweifelt versuchen, etwas zu finden, um ihre Softwareprobleme zu beschuldigen, aber wenn ich ein tatsächliches Problem habe, möchte ich versuchen, es zu beheben.
quelle
Antworten:
Oh, richtig, ich glaube, ich habe diesen Witz schon einmal gehört. Geht es nicht so etwas wie:
Hmm. Nun, vertrau mir, es ist viel lustiger im ursprünglichen Ungarisch.
Aber warum reagieren so viele Menschen, wenn ein System langsamer wird, zunächst darauf, dass es sich um die Datenbank handelt? Als ob App-Code nicht schrecklich geschrieben werden kann oder einfach ein paar Fehler hat? Dinge, die langsamer werden, könnten sicherlich die Datenbank sein. Aber einfach abschließen / einfrieren? Das scheint mir kein datenbankspezifisches Problem zu sein.
Wie es sich anhört, ist möglicherweise ein App-Code, der externe Ressourcen (Netzwerksockets, Dateisystemhandles usw.) nicht ordnungsgemäß freigibt. Wenn es sich um eine .NET-Anwendung handelt, vergessen Entwickler manchmal,
Dispose()
Objekte, denen nicht verwaltete Ressourcen zugeordnet sind , ordnungsgemäß zu verwenden . Zum Beispiel: Öffnen einesSqlConnection
Objekts. Sie bekommen nicht unendlich viele davon. Also, wenn sie in der Datenbank suchen wollen, dann gut. Aber vielleicht, wenn das System das nächste Mal einfriert, werfen Sie einen kurzen Blick auf:Wenn ihr Code die Verbindungen nicht freigibt, sollte es ziemlich offensichtlich sein, wenn zu viele Verbindungen vorhanden sind, insbesondere wenn viele von ihnen lange Leerlaufzeiten haben.
Und vielleicht wurde dieses Zeug bereits geprüft und in der Frage einfach nicht offengelegt. Aber es kommt mir ziemlich seltsam vor, dass sie sich so auf Indizes und Fragmentierung konzentrieren. Sicher, es gibt Probleme mit dem Parameter-Sniffing, die manchmal dazu führen , dass eine oder mehrere gespeicherte Prozeduren WIRKLICH LONG Zeit in Anspruch nehmen, aber eine gesamte Anwendung blockieren? Ich kaufe es nicht, insbesondere wenn Sie keine Abfrage sehen, die ausgeführt wird und viele Ressourcen oder Sperren beansprucht, oder wenn dies geschieht.
Also, "wem soll man vertrauen?" Sicher nicht dieser Anbieter ;-).
quelle
Eine Sache, die Sie überprüfen können, um festzustellen, ob Ihre Indizes neu organisiert oder neu erstellt werden müssen, ist die Verwendung dieser Abfrage:
Ersetzen
@strBD
durchyour database name
.Entsprechend den Ergebnissen verfahren Sie bitte wie unter https://msdn.microsoft.com/en-us/library/ms189858(v=sql.110).aspx angegeben . Dieser Link gilt für die Version 2012 von SQL Server. Bitte wählen Sie die richtige Version aus, um korrekt fortzufahren.
Wie jemand kommentierte, ist es besser, Ihrem Anbieter diese Überprüfung und Behebung über das "Fragmentierungsproblem" hinaus mitzuteilen. Identifizieren Sie möglicherweise einige Abfragen und Ausführungspläne mit einem SQL Profiler-Capture.
quelle
identifying some queries and execution plans with a SQL Profiler capture.
oh .. bitte .. nichtexec plans
mit Profiler erfassen . Es kann Ihren Server in die Knie zwingen. Schauen Sie stattdessen in DMV-Daten.