Welchen soll man vertrauen?


8

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.


15
Eine weitgehende Fragmentierung führt nicht dazu, dass Abfragen einfrieren und nicht mehr funktionieren. Sie müssen den Anbieter anweisen, sich von seinem Duff zu lösen und zu analysieren, was in SQL Server wirklich vor sich geht, wenn dieses Problem auftritt. Überprüfen Sie, ob Blockierungen vorliegen, überprüfen Sie die Wartestatistiken usw. auf der Banane, die ich gestern zu Mittag gegessen habe.
Aaron Bertrand

Die erste Frage, die ich hätte, ist, wie lange Sie warten, wenn das Problem auftritt. Ich gehe davon aus, dass dies ein Problem ist (basierend auf Ihrer Frage), wenn alle Abfragen in der Umgebung ausgeführt werden. Wir haben dies bei einigen Kunden gesehen, als Workloads auf Computern mit viel RAM und CPUs (> 16 GB,> 16 CPUs) ausgeführt wurden. Würde mich für die Hardwarekonfiguration interessieren, die Sie ausführen, die Wartezeiten, die Sie sehen, und die SQL Server-Version
Amit Banerjee

1
Darf ich empfehlen, pluralsight.com/courses/sqlserver-supporting-isv-applications anzuhören und sp_blitz von Brent Ozar aus auszuführen, um eine Liste von Empfehlungen anzuzeigen, die Sie dem System hinzufügen können, ohne Dinge zu beschädigen?
Henrik Staun Poulsen

Die einfache Antwort an den Anbieter, um zu verhindern, dass er von Fragmentierung besessen ist und tatsächlich mit der Diagnose beginnt, lautet: "Die Fragmentierung ist ständig vorhanden. Wenn dies die Hauptursache für dieses Problem wäre, würde dies auch den ganzen Tag passieren. Da dies offensichtlich nicht der Fall ist." den ganzen Tag kann es nicht das Problem sein, oder? ".
Sir schwört viel

Antworten:


1

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. ... Insbesondere sagen sie, dass unsere Indizes ein Problem sind.

Oh, richtig, ich glaube, ich habe diesen Witz schon einmal gehört. Geht es nicht so etwas wie:

Eine Ente betritt eine Bar und sagt: "Autsch!" (nur ein Scherz ;-) und der Barkeeper sagt: "Was wirst du haben?"

Die Ente sagt: "Gib mir 3 Finger deines stärksten Wodkas."

Der Barkeeper sagt, fast als würde er scherzen: "Meinst du nicht 3 'Federn'?"

Die Ente sagt: "Sieh mal, es tut mir leid, dass du nicht länger Chefautor für Everybody Loves Raymond bist , aber es war ein harter Tag, also könntest du ein Kumpel sein und mit dem Wodka machen?"

Der Barkeeper sagt: "Sicher, Kumpel. Warte."

Einen Moment später kommt er sichtlich etwas weniger glücklich zurück als bei seiner Abreise und sagt zu der Ente: "Sieht so aus, als hätten wir alle keine guten Sachen mehr. Alles, was wir noch haben, ist Skyy. Wird das funktionieren?"

Die Ente springt auf die Theke, packt den Barkeeper mit einem Flügel (irgendwie) am Kragen, zieht irgendwo mit dem anderen Flügel ein Messer heraus und sagt ziemlich langsam, leise, aber deutlich: "I. Will . Cut. Du. "

Der Barkeeper sagt in Panik: "Hey Mann, es ist die Datenbank. Sie ist langsam. Sie reagiert nicht."

Die Ente, ein bisschen verwirrt darüber, ob er den Barkeeper einfach beenden soll oder nicht - genau hier, genau jetzt - bellt ihn wütend an: "Die Datenbank? Worüber zum Teufel redest du?"

Der Barkeeper, der jetzt schluchzt, platzt heraus: "Ich weiß nicht ... Gibt es eine Blockierung? ... Es ist genau das, was wir sagen ... Können Sie versuchen, Indizes oder so etwas neu zu erstellen? ... Sie wissen, wann Wir wissen nicht, was wir sonst noch sagen sollen. Vielleicht sollten wir dem Server mehr Speicher hinzufügen. Glaubst du, das würde helfen? Jeder weiß, dass App-Code schnell ist und Datenbanken der Flaschenhals sind. ..Hey, ich habe von diesen NoSQL-Datenbanken gehört, die <air-quotes> im Webmaßstab </ air-quotes> sind und normalerweise Open Source sind, also kostenlos und ähnlich wie Twitter, Google und die Facebook alle nutzen dieses Zeug, da relationale Datenbanken auf dem Weg nach draußen sind. "

Und damit hatte sich die Ente entschieden ...........

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 eines SqlConnectionObjekts. 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:

SELECT sdec.*, '---' AS [---], sdes.*
FROM sys.dm_exec_connections sdec
INNER JOIN sys.dm_exec_sessions sdes
        ON sdes.session_id = sdec.session_id

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 ;-).


-1

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:

declare @strBD nvarchar(50)

set @strBD = N'Tu_BD';

select table = OBJECT_NAME(object_id, database_id)
    ,index = index_id
    ,Index_Type = index_type_desc
    ,Logic_Frag = avg_fragmentation_in_percent
    ,Action = case 
        when avg_fragmentation_in_percent < 30.0
            then 'ALTER INDEX REORGANIZE'
        else 'ALTER INDEX REBUILD WITH (ONLINE = ON)'
        end
from sys.dm_db_index_physical_stats(DB_ID(@strBD), null, null, null, 'LIMITED');

Ersetzen @strBDdurch your 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.


identifying some queries and execution plans with a SQL Profiler capture.oh .. bitte .. nicht exec plansmit Profiler erfassen . Es kann Ihren Server in die Knie zwingen. Schauen Sie stattdessen in DMV-Daten.
Kin Shah
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.