Ich habe seit einigen Wochen ein Problem, bei dem sich die Leistung meiner SQL Server-Abfragen über einige Tage hinweg verschlechtert. Außerdem wird eine Abfrage alle paar Tage einfach nicht vom ODBC- SQLExecute()
Aufruf meiner Anwendung zurückgegeben .
Durch manuelles Neuerstellen der Indizes (in SQL Server Management Studio) werden beide Probleme "behoben".
Hier finden Sie weitere Informationen.
- DB ist ~ 13 Gig groß
- Verwenden von ODBC Version 3.5.1 in der App
- Die Apps sind C ++ mit ODBC-Schnittstelle zur SQL-Datenbank
- Testfall ist auf einer statischen DB - keine Einfügungen, daher sollte keine Fragmentierung möglich sein!
- Kleine Abfragen dauern anfangs weniger als 1 Sekunde und werden auf über 50 Sekunden reduziert
- Habe das Problem auf allen (3) Computern gesehen, auf denen es ausgeführt wird
Es fällt mir schwer zu verstehen, warum die gleiche Abfrage für eine Weile gut funktioniert, aber dann beginnt ich, langsamer zu werden?
Irgendwelche Ideen wären sehr dankbar.
performance
sql-server-2005
index
user1825436
quelle
quelle
Antworten:
Abfragen können sich aus verschiedenen Gründen im Laufe der Zeit verlangsamen, und Sie können das Problem auf verschiedene Arten beheben, indem Sie die Indizes neu erstellen. Ich werde einige der häufigsten Gründe meiner Erfahrung mitteilen, aber es kann auch andere Ursachen geben. Ich vermute, Sie leiden unter einem dieser Probleme. Ich habe auch einige Fragen als Kommentar zu Ihrer Frage gestellt, um zu sehen, ob wir weitere Details erhalten können. Aber ein paar Gedanken:
Statistik Stale SQL Server verwaltet Spalten- und Indexstatistiken. Diese teilen dem Abfrageoptimierer im Wesentlichen mit, wie Ihre Daten verteilt werden. Diese Informationen sind für den Optimierer von entscheidender Bedeutung, wenn er die richtige Zugriffsmethode für Daten (Seek vs Scan) und anschließend die verwendete Verknüpfungsmethode auswählt. Wenn Sie die automatische Aktualisierungsstatistik aktiviert haben (Standardeinstellung in SQL. Auf Datenbankebene), werden diese neu berechnet, jedoch nur, wenn sich "genügend" Daten ändern. Wenn Sie also einige Einfügungen in Ihrer Tabelle haben, die Statistiken jedoch nie manuell aktualisieren und die Einfügungen / Aktualisierungen nicht ausreichen, um eine automatische Statistikaktualisierung auszulösen, leiden Sie möglicherweise unter schlechten Plänen für Ihre Datenverteilung. Durch die Neuerstellung Ihrer Indizes werden auch Ihre Indexstatistiken neu berechnet Ich würde einen Job erstellen, um Statistiken regelmäßig manuell zu aktualisieren. Dies ist ohnehin eine bewährte Methode.
sp_updatestats
Wenn dies das nächste Mal geschieht, versuchen Sie, es einfach in Ihrer Datenbank auszuführen und festzustellen, ob Sie einen Unterschied feststellenProbleme mit dem Abfrageplan Möglicherweise leiden Sie unter Parameter-Sniffing. Wenn eine Abfrage zum ersten Mal ausgeführt wird, wird ein Wert übergeben. Die Abfrage wird für diesen Wert optimiert. Wenn Sie es das nächste Mal mit einem anderen Wert ausführen, der von einem anderen Abfrageplan profitieren würde, leidet es unter dem ursprünglichen Abfrageplan, was zu einer langsamen Abfrage führt. Wenn die Dinge für die App langsam laufen - sind sie auch langsam, wenn Sie dieselbe Abfrage in SQL Server Management Studio ausführen? Wenn es in SSMS schnell, in der App jedoch langsam ist, kann dies ein gutes Zeichen für das Parameter-Sniffing sein. Wenn es im Laufe der Zeit für alle Abfragen und unabhängig von den Parametern durchweg langsam ist, würde ich hier nicht nachsehen. In diesem Artikel wird viel über das Parameter-Sniffing gesprochen.
Nicht genügend Speicher / zu viele Ad-hoc-Pläne Es scheint, als würden Sie Ad-hoc-SQL an SQL Server senden. Dies kann Ihren Plan-Cache manchmal aufblähen lassen, insbesondere wenn Sie für jede Ausführung einer Abfrage einen separaten Plan haben. Abhängig vom Speicher auf Ihrem Server kann dies auch zu dem Problem führen. Wie viel Speicher befindet sich auf Ihrem Server? Schauen Sie sich diesen Link zum Problem mit Einwegplänen an. Sie haben in SQL Server 2005 nicht viele großartige Lösungen für dieses Problem, wenn Sie es haben. Wenn Sie dieses Problem in einer Umgebung ohne Produkt wiederherstellen können, würde ich empfehlen, es
DBCC FREEPROCCACHE
in Ihrer Umgebung ohne Produkt auszuführen, wenn dies erneut auftritt. Bitte beachten Sie! Dies ist eine instanzweite Einstellung, wenn Sie dies in der Produktion tun. Gespeicherte Abfragepläne im Cache für eine Datenbank sind nicht mehr vorhanden. Es bedeutet, dass Sie für Zusammenstellungen erneut "bezahlen" müssen. Wenn Sie eine hohe Parallelität und ein ausgelastetes System haben, kann dies zu Problemen führen. Wenn dies die einzige echte Datenbank ist und Sie ohnehin unter Leistungsproblemen leiden, schadet es nicht, dies in der Produktion zu versuchen. Wenn Sie andere Datenbanken haben und dies nur für diese Datenbank tun möchten, wird in diesem Blogbeitrag erläutert, wie Sie vorgehen müssen eine klare für nur eine DB.Indexfragmentierung - Es ist möglich, dass die Indexfragmentierung hier das eigentliche Problem ist, aber ich bin überrascht, dass es so schnell so schlimm wird. Wenn Ihre Tabellen auf einem Schlüssel gruppiert sind, der schnell zu einer Fragmentierung führt, und Sie viele Einfügungen haben, kann dies der Fall sein. Es wäre viel schlimmer, wenn Sie in Bezug auf Speicher und Festplatten-E / A unterfordert wären. Es wäre gut, einen Job einzurichten, um Ihre Indizes regelmäßig neu zu erstellen / zu organisieren. Basierend auf Ihren Antworten auf einige Fragen in den obigen Kommentaren können andere Maßnahmen ergriffen werden, um die Auswirkungen zu minimieren.
quelle
Optimize for ad hoc workloads
und Datenbankeinstellungen auszuprobierenparameterization forced
.Wir hatten das gleiche Problem mit einer unserer Produktionsdatenbanken. Allerdings eine etwas andere Situation. Die Tabellen wurden gelesen / geschrieben und enthielten ca. Über 20 Millionen Datensätze.
Wir haben die Indizes jede Woche (am Wochenende) neu erstellt, was bis zum Montagnachmittag half, und dann würde sich die Leistung aufgrund der großen Datenmenge verschlechtern.
Abhängig von der Größe Ihrer Tabelle kann es sich um Speicherprobleme handeln, bei denen dem Server nur eine bestimmte Menge an Speicherplatz für eine bestimmte Anzahl von Datensatzgruppen im Cache zur Verfügung steht. (Puffer-Cache-Trefferquote unter 90%). Lösung: Das Hinzufügen von mehr Speicher zur SQL Server-Instanz kann hilfreich sein. Dies könnte die Puffer-Cache-Trefferquote auf über 90% verbessern. Das Ergebnis ist, dass die Daten aus dem Speicher und nicht von den physischen Laufwerken abgerufen werden.
Wenn das SQL-Datenbankmodul die Abfragen "optimiert", mit denen die Daten abgerufen werden sollen, liegt möglicherweise ein Problem mit der Indexstatistik vor. (Dies war das Problem mit unserem riesigen Tisch). Die Stastiken waren veraltet. Lösung: Durch tägliches Aktualisieren der Indexstatistik für diese Tabelle können Ihre Probleme möglicherweise behoben werden.
Da Ihr Problem ein kurzfristiges Problem ist, würde ich vermuten, dass es sich um ein Problem mit der Puffer-Cache-Trefferquote (zu wenig SQL-Speicher) handelt. Das SQL Query Optimizer entfernt kleine Datensatzgruppen aus meomry, um Daten aufzunehmen, die häufiger abgerufen werden.
quelle
Ein paar Dinge fallen mir ein.
Werden die ODBC-Verbindungsobjekte am Ende jeder Abfrage geschlossen und gelöscht? Andernfalls wächst der Verbindungspool weiter.
Fehlen Indizes? In den dynamischen Verwaltungsansichten erfahren Sie, was dort passiert.
quelle