10 Stimmen

Wie behebt man Abfragen, die nur langsam laufen, bis sie zwischengespeichert werden?

Ich habe einige Abfragen, die in unserer Live-Umgebung Timeouts verursachen. (>30 Sekunden)

Wenn ich den Profiler ausführe und den genauen SQL-Code abgreife, der ausgeführt wird, und ihn von Management Studio aus ausführe, dauert die Ausführung beim ersten Mal sehr lange und sinkt dann bei jedem weiteren Durchlauf auf ein paar hundert Millisekunden.

Dabei handelt es sich offensichtlich um SQL, das die Daten zwischenspeichert und alle Daten in den Speicher holt.

Ich bin sicher, dass es Optimierungen gibt, die an der SQL vorgenommen werden können, um sie schneller laufen zu lassen.

Meine Frage ist, wie kann ich "fix" diese Abfragen, wenn das zweite Mal, wenn ich es ausführen, die Daten bereits zwischengespeichert wurde und ist schnell?

11voto

John Sansom Punkte 40295

Ich schlage vor, dass Sie den Ausführungsplan für die Abfragen prüfen, die für Ihre schlechten Leistungsprobleme verantwortlich sind.

Sie müssen im Rahmen des Ausführungsplans ermitteln, welche Schritte die höchsten Kosten verursachen und warum. Es könnte sein, dass Ihre Abfragen einen Tabellenscan durchführen oder dass ein ungeeigneter Index verwendet wird.

Auf der RedGate-Website ist ein sehr detailliertes, kostenloses ebook erhältlich, das sich speziell auf das Verständnis des Inhalts von Ausführungsplänen konzentriert.

https://www.red-gate.com/Dynamic/Downloads/DownloadForm.aspx?download=ebook1

Vielleicht gibt es einen bestimmten Ausführungsplan, den Sie für Ihre Abfrage verwenden möchten. Sie können mit Hilfe von Abfragehinweisen erzwingen, welcher Ausführungsplan für eine Abfrage in SQL Server verwendet wird. Dies ist jedoch ein recht fortschrittliches Konzept und sollte mit Bedacht eingesetzt werden. Weitere Einzelheiten finden Sie in dem folgenden Microsoft White Paper.

http://www.microsoft.com/technet/prodtechnol/sql/2005/frcqupln.mspx

Ich würde auch nicht empfehlen, den Prozedurenzwischenspeicher in Ihrer Produktionsumgebung zu löschen, da dies die Leistung aller anderen Abfragen auf der Plattform beeinträchtigen würde, die derzeit keine Leistungsprobleme haben.

Wenn Sie z.B. eine gespeicherte Prozedur ausführen, können Sie mit dem Befehl WITH RECOMPILE sicherstellen, dass für jede Ausführung der Prozedur ein neuer Ausführungsplan berechnet wird.

Für allgemeine Informationen zur Leistungsoptimierung gibt es einige ausgezeichnete Ressourcen im Blog von Brent Ozar.

http://www.brentozar.com/sql-server-performance-tuning/

Ich hoffe, das hilft. Zum Wohl.

9voto

Welbog Punkte 57431

Según http://morten.lyhr.dk/2007/10/how-to-clear-sql-server-query-cache.html können Sie folgendes ausführen, um den Cache zu löschen:

DBCC DROPCLEANBUFFERS   
DBCC FREEPROCCACHE  

EDIT: Ich habe in der mir vorliegenden SQL Server-Dokumentation nachgesehen, und dies gilt zumindest für SQL Server 2000.

5voto

Coolcoder Punkte 3986

Verwenden Sie können verwenden

DBCC DROPCLEANBUFFERS   
DBCC FREEPROCCACHE

Verwenden Sie dies jedoch nur in Ihrer Entwicklungsumgebung, während Sie die Abfragen für den Einsatz auf einem Live-Server abstimmen.

3voto

Steve Jones Punkte 148

Ich glaube, die Leute laufen in die falsche Richtung. Wenn ich Sie richtig verstehe, wollen Sie, dass die Leistung immer gut ist? Laufen sie bei der 2. (und nachfolgenden) Ausführung nicht schnell und sind beim ersten Mal langsam?

Die oben genannten DBCC-Befehle leeren den Cache, was zu einer schlechteren Leistung führt.

Was Sie wollen, ist, die Pumpe zu starten und die Daten zwischenzuspeichern. Sie können dies mit einigen Startprozeduren tun, die die Abfragen ausführen und Daten in den Speicher laden.

Speicher ist eine endliche Ressource, daher können Sie nicht alle Daten in den Speicher laden, aber Sie können ein Gleichgewicht finden. Brent hat einige gute Referenzen oben zu helfen, zu lernen, was Sie hier tun können.

2voto

Adam Ralph Punkte 28333

Abfrageoptimierung ist ein umfangreiches Thema, auf das es keine einheitliche Antwort gibt. Die Anhaltspunkte dafür, was zu tun ist, finden sich alle im Abfrageplan, der unabhängig davon, ob die Ergebnisse zwischengespeichert werden oder nicht, derselbe sein sollte.

Achten Sie auf die üblichen Dinge, wie z. B. Tabellenscans, Indizes, die nicht verwendet werden, wenn sie eigentlich verwendet werden sollten, usw. usw. Letztendlich müssen Sie möglicherweise Ihr Datenmodell überarbeiten und vielleicht eine Denormalisierungsstrategie umsetzen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X