MS SQL Server verlangsamt sich im Laufe der Zeit?


8

Hat einer von Ihnen Folgendes erlebt und eine Lösung gefunden:

Ein großer Teil des Backends unserer Website ist MS SQL Server 2005. Jede oder zwei Wochen läuft die Website langsamer - und ich sehe, dass Abfragen in SQL immer länger dauern. Ich habe eine Abfrage, die ich gerne verwende:

USE master
select text,wait_time,blocking_session_id AS "Block",
percent_complete, * from sys.dm_exec_requests 
CROSS APPLY sys.dm_exec_sql_text(sql_handle)  AS s2 order by start_time asc

Was ziemlich nützlich ist ... es gibt einen Schnappschuss von allem, was gerade auf Ihrem SQL Server läuft. Das Schöne ist, dass diese Abfrage auch dann zurückgegeben wird, wenn Ihre CPU aus irgendeinem Grund auf 100% festgelegt ist und Activity Monitor das Laden verweigert (ich bin sicher, dass einige von Ihnen dort waren), immer noch zurückgegeben wird und Sie sehen können, welche Abfrage Ihre Datenbank zerstört.

Wenn ich dies oder den Aktivitätsmonitor während der Zeit ausführe, in der SQL langsamer wird, werden keine spezifischen Abfragen angezeigt, die das Problem verursachen. ALLE werden auf der ganzen Linie langsamer ausgeführt. Wenn ich den MS SQL-Dienst neu starte, ist alles in Ordnung, es beschleunigt sich - für ein oder zwei Wochen, bis es wieder passiert.

Nichts, woran ich denken kann, hat sich geändert, aber das hat erst vor ein paar Monaten begonnen ... Ideen?

--Hinzugefügt

Beachten Sie, dass es bei dieser Datenbankverlangsamung keine Rolle spielt, ob 100.000 Seitenaufrufe pro Stunde (geschäftigere Tageszeit) oder 10.000 Seitenaufrufe pro Stunde (langsame Zeit) angezeigt werden. Die Abfragen dauern alle länger als normal. Der Server ist nicht wirklich unter Stress - die CPU ist nicht hoch, die Festplattennutzung scheint nicht außer Kontrolle zu sein ... es fühlt sich an wie Indexfragmentierung oder ähnliches, aber das scheint nicht der Fall zu sein Fall.

Was das Einfügen der Ergebnisse der oben eingefügten Abfrage angeht, kann ich das wirklich nicht. Die obige Abfrage listet die Anmeldung des Benutzers auf, der die Aufgabe ausführt, die gesamte Abfrage usw. usw. und ich möchte die Namen meiner Datenbanken, Tabellen, Spalten und Anmeldungen wirklich nicht online verteilen :) ... I. Ich kann Ihnen sagen, dass die zu diesem Zeitpunkt ausgeführten Abfragen normale Standardabfragen für unsere Website sind, die ständig ausgeführt werden und nichts Außergewöhnliches sind.

- 24. März

Seit dem letzten Neustart sind ungefähr zwei Wochen vergangen. Ich habe einige Änderungen vorgenommen: Ich habe einige Abfragen gefunden, bei denen wir temporäre Tabellen stark genutzt haben, die völlig unnötig waren, und unsere Entwickler haben ihre Vorgehensweise ändern lassen. Ich habe die Größe einiger der ständig (langsam aber sicher) wachsenden Datenbanken auf eine intelligente Größe für ihr Wachstum angepasst. Ich habe die Einstellungen für das automatische Wachstum so angepasst, dass alles intelligenter ist (alle waren auf 1 MB Wachstum eingestellt). Zuletzt habe ich MSDB ein bisschen aufgeräumt. Wir protokollieren den Versand und mussten wirklich keine jahrelangen Sicherungspunkte aufbewahren. Ich habe einige Skripte geschrieben, die dies nur auf wenige Monate beschränken. Ich werde diesen Thread weiter aktualisieren, da es noch zu früh ist, um festzustellen, ob das Problem noch gelöst ist.


Wenn Sie dieselben Abfragen über Management Studio ausführen, treten dieselben Leistungsprobleme auf, als würden sie über die Anwendung ausgeführt? Was bewirkt, dass der Leistungsabfall stoppt oder verschwindet? Starten Sie den Server neu? Ist das ein physischer Server oder eine VM? Hat es einen eigenen Speicher oder ist es Teil eines SAN?
DCNYAM

Network Attached Storage, ein MD 3000 um genau zu sein. Wenn Sie den SQL-Dienst neu starten, wird er nicht mehr angezeigt. Ja, Sie sehen während dieser Zeit die gleichen langsameren Reaktionszeiten im Studio.
Dave Holland

Antworten:


3

Wir haben es gefunden. Es stellte sich heraus, dass es sich tatsächlich um einen Webserver handelte, der ein Problem mit einem seiner App-Pools hatte. Es würde stecken bleiben und immer wieder die gleichen Abfragen ausführen (was zufällig in temporären Tabellen der Fall war). Es würde nur eine Schleife und eine Schleife bilden und schließlich dazu führen, dass der SQL Server traurig ist. Sobald dieser fehlerhafte Maschinen- / App-Pool gefunden und "abgelegt" wurde, wurde alles behoben.


2

Sie müssen sich fragen, was bei einem Neustart des SQL-Dienstes passiert. Vieles, aber zwei relevante Punkte fallen mir ein:

1) SQL-Speicher wird freigegeben.

Es ist möglich (nicht sicher, wie wahrscheinlich), dass, wenn Ihre MaxMemory-Einstellung zu hoch eingestellt ist, der SQL-Dienst wächst, um den gesamten verfügbaren Speicher zu nutzen, und Windows beginnt, wichtige Daten in die Auslagerungsdatei auszutauschen. Stellen Sie sicher, dass MaxMemory auf einen angemessenen Wert eingestellt ist und genügend zusätzlichen Speicher für alles übrig bleibt, was auf dieser Box ausgeführt werden muss (handelt es sich um einen dedizierten SQL-Server? Oder handelt es sich auch um den App-Server?).

2) TempDB wird aus den Standardgrößen neu erstellt.

Überprüfen Sie Ihre Standard-Tempdb-Dateigrößen, insbesondere die Standardgröße und das Wachstumsintervall der TempDB-Protokolldatei. Wenn das Wachstumsintervall zu niedrig eingestellt ist, kann das Protokoll eine unglaubliche interne Fragmentierung aufbauen, die die normale Nutzung drastisch verlangsamen kann. Sehen Sie sich diese beiden ausgezeichneten Blog-Artikel von Kimberly Tripp an.


1) Der Computer ist ein dedizierter SQL Server mit 16 GB Speicher, wobei 14 GB SQL zugewiesen sind. 2) Ich musste nicht neu starten, da ich einige Anpassungen an der DB-Größe und dem Wachstum vorgenommen habe. Die temporäre Tabelle war in den von mir vorgenommenen Anpassungen enthalten, sodass es möglich ist, dass sie Auswirkungen hat. Es sind nur ein paar Wochen vergangen, also warte ich ab, ob die Situation wieder passiert.
Dave Holland

1

Verwenden Sie häufig temporäre Tabellen oder Cursor? Überprüfen Sie, ob alle Cursor geschlossen und ordnungsgemäß freigegeben wurden. Achten Sie auch auf Verbindungsserver - wir müssen einen fehlerhaften Treiber für einen alten Verbindungs-Informix-Server verwenden, und dies bedeutet regelmäßig, dass wir den Server neu starten müssen.


Wir verwenden nicht wenige Temptabelle Anrufe, Cursor Ich hoffe , dass wir oft nicht benutzen , aber ich nehme an, es IST möglich , einige unserer älteren Codierung „Standards“ zu wissen , so dass ich in diesem Blick wird. Wir verwenden jedoch nur einen Verbindungsserver und einen anderen 2005 SQL-DB.
Dave Holland

0

Wenn es komisch aussieht, dann suche das Seltsame.

Wenn das Optimieren der SQL Server-Einstellungen nicht hilft, versuchen Sie es mit dem Windows-Task-Manager: Gehen Sie zur Registerkarte Prozesse, dann zu Optionen> Spalten> CPU-Zeit hinzufügen, Handles, Lesen, Schreiben, andere und die Speicheroptionen.

Gehen Sie zurück zur Prozessliste. Sortieren Sie für jede Spalte nach dem höchsten zum niedrigsten Wert und sehen Sie sich die fünf wichtigsten Prozesse an. Etwas Außergewöhnliches? Beispiel: Ein Speicherverlust in einem Prozess hat eine bizarre Anzahl von Handles. Wir haben einige * ki-Drucker, die dem DCSLoader-Prozess alle 2 Sekunden ein Handle hinzufügen. Nach ein paar Wochen listet eine Maschine viel freien Speicher und CPU auf, aber ein Prozess mit 100.000 Handles und bewegt den Mauszeiger kaum.

Überprüfen Sie auch Ihre Liste der geplanten Aufgaben. Weisen Sie Ihren AV an, keine .mdf-Dateien zu scannen.


Ja, ich habe das alles getan, nichts in den Prozesslisten ist ungewöhnlich, und wie ich bereits sagte, starte ich den Computer nicht neu. Starten Sie nur den SQL-Dienst neu und das Problem ist behoben, so dass es unwahrscheinlich ist, dass ich gehe um das Problem außerhalb von SQL Server-Prozessen zu finden. Ein Blick auf die Griffe ist jedoch eine gute Idee, das werde ich beim nächsten Mal überprüfen.
Dave Holland

0

Dave,

Haben Sie die Wartestatistiken überprüft? In der oben angegebenen Abfrage wird die Spalte 'last_wait_type' aufgeführt. Diese Spalte enthält möglicherweise einige Details dazu, worauf die Abfragen warten (Netzwerk, CPU usw.).


Ich habe nicht, aber ich sollte. Ich werde das beim nächsten Mal überprüfen.
Dave Holland

0

Wenn Ihr Backup "Wiederherstellungsmodell" VOLL ist, verbessert eine Sicherung der Datenbank und dann eine Sicherung der Transaktionsprotokolle die Dinge überhaupt? Auf einem System, auf dem nicht genügend Speicherplatz vorhanden ist, kann dies das Problem erklären.


Alle DBs werden alle 15 Minuten protokolliert ausgeliefert. Dies bedeutet, dass die Datenbank- und Trans-Protokolle ständig gesichert werden. Dies ist also nicht das Problem. Sie werden auch alle auf einem MD3K mit etwa einem Terabyte freiem Speicherplatz ausgeführt.
Dave Holland

gut zu wissen. Mit welcher Methode stellen Ihre SQL-Clients eine Verbindung zum SQL Server her? Trotzdem viele Fragen. Ist der Server 64-Bit?
Djangofan

Die Clients sind .net-Websites (toolbox.com) und ja 64-Bit.
Dave Holland

Verwenden Ihre .net-Clients den Treiber jdbc2.x und verwenden sie die integrierte Authentifizierung oder nicht?
Djangofan

0

Ich habe anscheinend eine Konfiguration, die Ihrer sehr ähnlich ist (16 GB, aktualisiert auf 32 GB, und MD1000 mit einem Terabyte Festplatten, Dual Quadcore XEON).

Das einzige, was mir in der Vergangenheit geholfen hat, solche bizarren Probleme zu diagnostizieren, ist beta_lockinfo von Erland Sommarskog. Führen Sie es aus, wenn es langsam ist, und vergleichen Sie es.

Außerdem hatte ich vor SP2 unglaublich viele Probleme mit SQL 2005, aber SP3 ist wirklich stabil.


Eigentlich erinnerte ich mich nur. Versuchen Sie es mit "Seiten im Speicher sperren". Mit CU4 für SP3 kann es sogar SQL 2005 Standard verwenden. Siehe blogs.msdn.com/suhde/archive/2009/05/20/…
Ricardo Pardini

0

Hoffe das gibt mehr nützliche Infos:

SELECT  D.text SQLStatement,
        A.Session_ID SPID,
        C.BlkBy,
        ISNULL(B.status, A.status) Status,
        A.login_name Login,
        A.host_name HostName,
        DB_NAME(B.Database_ID) DBName,
        B.command,
        ISNULL(B.cpu_time, A.cpu_time) CPUTime,
        ISNULL((B.reads + B.writes), (A.reads + A.writes)) DiskIO,
        A.last_request_start_time LastBatch,
        A.program_name
FROM    sys.dm_exec_sessions A
        LEFT JOIN sys.dm_exec_requests B
        ON A.session_id = B.session_id
        LEFT JOIN (
                   SELECT   A.request_session_id SPID,
                            B.blocking_session_id BlkBy
                   FROM     sys.dm_tran_locks AS A
                            INNER JOIN sys.dm_os_waiting_tasks AS B
                            ON A.lock_owner_address = B.resource_address
                  ) C
        ON A.Session_ID = C.SPID
        OUTER APPLY sys.dm_exec_sql_text(sql_handle) D
WHERE   DB_NAME(B.Database_ID) = 'YourDBName' -- Comment out line for all db's
ORDER BY ISNULL(B.cpu_time, A.cpu_time) + ISNULL((B.reads + B.writes), (A.reads + A.writes)) DESC

Stellen Sie sicher, dass db in Ordnung ist mit:

DBCC CHECKDB -- Checks the allocation and structural integrity of all the objects in the specified database.
DBCC UPDATEUSAGE (bybox) -- Reports and corrects pages and row count inaccuracies in the catalog views

Behalten Sie den Logspace im Auge mit:

DBCC SQLPERF(LOGSPACE)

Wenn Sie eine Expansion sehen, wird dies die Dinge definitiv verlangsamen. Wenn Sie dies ausführen, wird Ihr Logspace immer näher an 100% heranrücken, dann wird das Log erweitert und der Prozentsatz wird kleiner, wenn er etwas Platz hat. Hoffentlich werden Sie nie sehen, wie es erweitert wird, bevor Ihr Backup startet und das Protokoll löscht.


Wenn ich die erste Abfrage ausführe, erhalte ich keine Ergebnisse - hauptsächlich, weil es in diesen langsamen Zeiten wirklich keine blockierenden Sitzungen gibt ... es ist nur so, dass die Abfragen im Allgemeinen alle langsamer ausgeführt werden. Ich habe alle DBCC-Überprüfungen und Update-Anwendungen durchlaufen und sie sahen gut aus. In Bezug auf DBCC SQLPERF (LOGSPACE) ist die einzige Datenbank, die jemals annähernd 100% (bei 75%) erreicht hat, ein Modell, das sich nie wesentlich ändert. Die Protokollsicherungen kümmern sich um die Protokollgröße.
Dave Holland

-1

Meistens idiotische Konfiguration. Das passiert.

  • Zunächst sollten Sie die Indexdefragmentierung in einem Wartungslauf regelmäßig ausführen. Planen Sie es als Aktivität, kurz bevor oder nachdem Sie Backups erstellt haben.

  • Zweitens sollten Sie Ihre Datenbank nicht automatisch vergrößern und insbesondere nicht automatisch verkleinern. Je nach Last sind Autogrow / Autoshrink grundsätzlich Selbstmordeinstellungen.

Ich habe noch nie so eine Verlangsamung von SQL Server gesehen. Können Sie die Ergebnisse dieser Abfrage in Zeiten großen Stresses veröffentlichen? Sicher, dass zu diesem Zeitpunkt nichts an Ihrem Ende SQL Server überlastet?


Zu Ihrem ersten Punkt: Wir haben wöchentliche (und einige täglich, abhängig von den Tabellen) Wartungsjobs, die die Defragmentierung und Aktualisierung von Statistiken indizieren. Wenn Sie Informationen in den Indizes zurückziehen, sind diese weniger als 2-3% fragmentiert, auch wenn sie langsam sind. Zu Ihrem zweiten Punkt: Wir schrumpfen nicht automatisch - auf jeden Fall. Diese Datenbanken enthalten Benutzerinformationen / Website-Inhalte usw., die ständig zunehmen (nicht um eine Tonne ... das sind keine riesigen Datenbanken), aber wenn ich sie nicht automatisch wachsen lasse, wie sollen sie dann groß genug sein? Ich werde am Ende meines Beitrags einige Details hinzufügen, um das Letzte von dem anzusprechen, was Sie gesagt haben.
Dave Holland

3
Autogrow ist keine schlechte Sache. Sich darauf zu verlassen ist, aber es zu aktivieren ist viel besser als alle Änderungen an Ihrer Datenbank, die gestoppt werden, weil sie die maximale Größe haben.
Sean Howat

2
Wachstum in Prozent ist normalerweise auch keine gute Sache. Wenn Ihre Datenbank groß wird, ist ein Wachstum von 5% viel größer als zu Beginn der Datenbank. 1 MB ist zu klein, aber Sie sollten sich für eine feste MB-Wachstumsrate entscheiden, die auf der Größe und Nutzung Ihrer Datenbank basiert.
DCNYAM

1
Autogrow ist schlecht, da es die Datei mit einem Protokoll kleiner Schritte gruppiert. Hat viele negative Auswirkungen. support.microsoft.com/kb/315512 Eher: Stellen Sie die Dateien auf die richtige Größe ein und führen Sie dann regelmäßige Überprüfungen mit einem Füllbericht durch. Stellen Sie sicher, dass sie nicht überwachsen. 1 MB könnte der mögliche Schuldige sein, übrigens ... wenn es während der Wartung anhalten / wachsen / stoppen / wachsen muss, möchten Sie die Leistung nicht wissen.
TomTom

1
Autogrow ist harmlos, sofern es selten vorkommt. Wenn es schlecht wird, wird es als Ersatz für die richtige Dimensionierung verwendet, was meiner Meinung nach TomTom wirklich bedeutet. Andernfalls verwenden Sie es auf jeden Fall.
Maximus Minimus
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.