8

Ich habe einige Abfragen, die Timeouts in unserer Live-Umgebung verursachen. (> 30 Sekunden)Wie beheben Sie Abfragen, die nur langsam ausgeführt werden, bis sie zwischengespeichert werden

Wenn ich Profiler ausführe und das genaue SQL, das gerade ausgeführt wird, laufe und es von Management Studio aus starte, dauert es sehr lange, bis das erste Mal ausgeführt wird, und danach jeweils einige hundert Millisekunden.

Dies ist offensichtlich SQL-Caching der Daten und alles im Speicher zu bekommen.

Ich bin sicher, dass es Optimierungen gibt, die an die SQL gemacht werden können, die es schneller laufen lässt.

Meine Frage ist, wie kann ich diese Abfragen "reparieren", wenn das zweite Mal ich es ausgeführt habe, die Daten bereits zwischengespeichert und ist schnell?

Antwort

8

Nach http://morten.lyhr.dk/2007/10/how-to-clear-sql-server-query-cache.html, können Sie die folgende löscht den Cache laufen:

DBCC DROPCLEANBUFFERS 
DBCC FREEPROCCACHE 

EDIT: Ich überprüfte mit der SQL Server-Dokumentation ich habe, und dies gilt zumindest für SQL Server 2000

+0

Sehr gut! Genau das, was ich gesucht habe. Ich bekomme jetzt völlig konsistente Ergebnisse beim Ausführen der Abfrage! –

+1

Läuft das nicht jedes Mal langsam? – DevinB

+1

Sie müssen die Abfrage nicht jedes Mal langsam ausführen, um sie zu optimieren. der Abfrageplan wird konsistent bleiben, ob die Ergebnisse zwischengespeichert sind oder nicht (siehe meine Antwort) –

2

Abfrageoptimierung ist ein großes Thema, es gibt keine einzelne Antwort auf Ihre Frage. Die Hinweise dazu, was zu tun ist, befinden sich alle im Abfrageplan, der derselbe sein sollte, unabhängig davon, ob die Ergebnisse im Cache gespeichert sind oder nicht.

Suchen Sie nach den üblichen Dingen wie Tabellen-Scans, Indizes, die nicht verwendet werden, wenn Sie sie verwenden, etc. usw. Letztendlich müssen Sie möglicherweise Ihr Datenmodell öffnen und vielleicht eine Denormalisierungsstrategie implementieren.

0

Von MSDN:
"Verwenden Sie DBCC DROPCLEANBUFFERS, um Abfragen mit einem kalten Puffercache zu testen, ohne den Server herunterzufahren und neu zu starten."

4

Verwendung kann

DBCC DROPCLEANBUFFERS 
DBCC FREEPROCCACHE 

verwenden, aber dies nur in der Entwicklungsumgebung verwenden, während die Abfragen für die Bereitstellung auf einem Live-Server zu stimmen.

+1

"Aber nutze das nur in deiner Entwicklungsumgebung" guter Ruf. +1 – Welbog

8

Darf ich vorschlagen, dass Sie den Ausführungsplan für die Abfragen überprüfen, die für Ihre schlechten Leistungsprobleme verantwortlich sind.

Sie müssen innerhalb des Ausführungsplans angeben, welche Schritte die höchsten Kosten haben und warum. Es könnte sein, dass Ihre Abfragen einen Tabellenscan ausführen oder dass zum Beispiel ein unpassender Index verwendet wird.

Auf der RedGate-Website gibt es ein sehr detailliertes, kostenloses E-Book, das sich speziell auf das Verständnis der Inhalte von Ausführungsplänen konzentriert.

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

Sie können feststellen, dass es einen bestimmten Ausführungsplan, die Sie für Ihre Abfrage verwendet werden sollen. Sie können erzwingen, welcher Ausführungsplan für eine Abfrage in SQL Server mithilfe von Abfragehinweisen verwendet wird. Dies ist jedoch ein ziemlich fortgeschrittenes Konzept und sollte mit Diskretion verwendet werden. Weitere Informationen finden Sie im folgenden Microsoft White Paper.

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

Ich würde auch nicht empfehlen, dass Sie den Prozedur-Cache auf der Produktionsumgebung zu löschen, da dies auf der Plattform, um die Leistung aller anderen Abfragen schädlich sein wird, die derzeit nicht Probleme Leistung Erfahrung.

Wenn Sie beispielsweise eine gespeicherte Prozedur ausführen, können Sie sicherstellen, dass für jede Ausführung der Prozedur ein neuer Ausführungsplan mithilfe des Befehls WITH RECOMPILE berechnet wird.

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

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

Hoffnung, das hilft. Prost.

+0

Einige tolle Links (und Vorschläge) dort! +1 –

3

Ich denke, die Leute laufen in die falsche Richtung. Wenn ich verstehe, wollen Sie, dass die Aufführung die ganze Zeit gut ist? Laufen sie die 2. (und nachfolgende Ausführungen) nicht schnell und sind beim ersten Mal langsam?

Die oben genannten DBCC-Befehle löschen den Cache und verursachen eine schlechtere Leistung.

Was Sie wollen, denke ich, ist die Pumpe zu primen 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 wahrscheinlich nicht alle Daten in den Speicher laden, aber Sie können ein Gleichgewicht finden. Brent hat einige gute Referenzen, um zu lernen, was Sie hier tun können.