Wie behebt man Abfragen, die nur langsam ausgeführt werden, bis sie zwischengespeichert werden?

8

Ich habe einige Anfragen, die Timeouts in unserer Live-Umgebung verursachen. (& gt; 30 Sekunden)

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

Dies ist offensichtlich SQL-Cache die Daten und alles im Speicher bekommen.

Ich bin mir sicher, dass es Optimierungen gibt, die an der SQL gemacht werden können, damit sie schneller läuft.

Meine Frage ist, wie kann ich diese Abfragen "reparieren", wenn die Daten beim zweiten Mal bereits zwischengespeichert wurden und schnell sind?

    
Robin Day 29.01.2009, 12:38
quelle

6 Antworten

8

Nach Ссылка können Sie laufen Folgendes um den Cache zu löschen:

%Vor%

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

    
Welbog 29.01.2009, 12:44
quelle
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 im Ausführungsplan angeben, welche Schritte die höchsten Kosten verursachen und warum. Es könnte sein, dass Ihre Abfragen einen Tabellenscan ausführen oder dass beispielsweise 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.

Ссылка

Möglicherweise gibt es einen bestimmten Ausführungsplan, den Sie für Ihre Abfrage verwenden möchten. 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.

Ссылка

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

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

Für die allgemeinen Informationen zur Leistungsoptimierung stehen im Blog von Brent Ozar einige hervorragende Ressourcen zur Verfügung.

Ссылка

Hoffe, das hilft. Prost.

    
John Sansom 30.01.2009 13:51
quelle
4

Verwenden kann

verwenden %Vor%

Aber verwenden Sie dies nur in Ihrer Entwicklungsumgebung, während Sie die Abfragen für die Bereitstellung auf einem Live-Server optimieren.

    
Coolcoder 29.01.2009 12:47
quelle
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 nicht schnell die 2. (und nachfolgende Ausführungen) und sind das erste Mal langsam?

Die obigen DBCC-Befehle löschen den Cache, was zu einer schlechteren Leistung führt.

Was Sie wollen, ist, denke ich, 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.

    
Steve Jones 30.01.2009 17:36
quelle
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 unabhängig davon, ob die Ergebnisse im Cache gespeichert sind, gleich sein sollte.

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

    
Adam Ralph 29.01.2009 12:45
quelle
0

Von MSDN:
"Verwenden Sie DBCC DROPCLEANBUFFERS , um Abfragen mit einem Cold-Buffer-Cache zu testen, ohne den Server herunterzufahren und neu zu starten. "

    
gkrogers 29.01.2009 12:47
quelle