Frage

Wir haben eine Off -the Shelf -Anwendung, die eine Microsoft SQL -Datenbank verwendet. Innerhalb dieser Anwendung wählen wir für jeden Bericht verschiedene Auswahlkriterien aus. In dieser Anwendung wird diese Berichte ausgeführt.

Ich glaube, wir haben ein Problem mit Abfragenplan. Der erste Bericht, den wir jeden Tag laufen, läuft sehr schnell 7 Minuten. Jeder Bericht, den wir nach dem ersten Bericht ausführen, dauert über eine Stunde.

Jede Nacht führen wir eine geplante Aufgabe aus, die SQL Server Agent und SQL Server gestartet und startet. In dieser einen Instanz von SQL Server gibt es ungefähr 25 weitere Datenbanken. Keine anderen Datenbanken haben Leistungsprobleme, nur das von mir zuvor erwähnte Regalprodukt.

Gibt es eine Möglichkeit, alle Abfragepläne zu beseitigen, die SQL Server derzeit im Speicher hat?

Wie kann ich das tun, ohne mich auf 30 Benutzer zu betreffen, die sich auf andere Datenbanken auf demselben Server verlassen?

War es hilfreich?

Lösung

Ich entschuldige mich für meine vorherige Antwort.

1) Fügen Sie die Option "With Recompile" zur Anweisung für Erstellen von Erstellen hinzu, wenn Sie wissen, dass Ihre Abfrage jedes Mal variiert, wenn sie aus der gespeicherten Prozedur ausgeführt wird. Die Option With Recompile verhindert die Wiederverwendung des Speicherplans für gespeicherte Prozeduren, sodass SQL Server keinen Plan für diese Prozedur zwischenspeichert und die Prozedur zur Laufzeit neu kompiliert wird. Die Verwendung der Option "With Recompile" kann die Leistung steigern, wenn Ihre Abfrage jedes Mal variiert, wenn sie aus der gespeicherten Prozedur ausgeführt wird, da in diesem Fall der falsche Ausführungsplan nicht verwendet wird.

2) Sie müssen Erstellen Sie einen Planhandbuch, bei dem eine Nutzungsplan -Abfrage verwendet wird Hinweis für jede Art von Abfrage (jeder gespeicherte Verfahrensanforderungsart), um den Ausführungsplan zu erzwingen.

Hier ist Artikel über Ausführungsplan, der helfen kann.

Andere Tipps

Sie haben hier zwei Fragen gestellt. Erstens möchten Sie wissen, ob Sie alle im Speicher gespeicherten Pläne für eine Instanz von SQL entfernen können. Dies geschieht mit DBCC -FreeProcccache, wie Matt M vorgeschlagen hat.

Die zweite Frage, die Sie stellten, lautet: "Wie kann ich dies tun, ohne mich auf 30 Benutzer zu betreffen, die sich auf andere Datenbanken auf demselben Server verlassen?". Die kurze Antwort lautet "Sie können nicht". Wenn Sie alle Pläne entfernen als die anderen Benutzer, die sich auf den Speicher von Plänen angewiesen haben, werden wahrscheinlich einen Leistungshit erleiden.

Die Problemumgehung dafür erfordert eine manuelle Intervention. Sie können DBCC FreeProcccache verwenden, um bestimmte Pläne zu entfernen, sofern Sie den Plan_Handle haben.

Nach dem, was Sie oben beschreiben, klingt es nach einem Planproblem, aber ich bin mir nicht sicher, dass das Entfernen von Plänen die Antwort ist. Ich würde Sie in Richtung des Parameters reiten, bevor ich über das Entfernen von Plänen nachdenke:

http://blogs.msdn.com/b/conor_cunningham_msft/archive/2010/08/11/conor-vs-misbehavaving-parameterized-queries-optimize-for-hints.aspx

Sie sollten in der Lage sein, die Abfragen zu optimieren, anstatt auf geplanter Basis mit DBCC -FreeProcccache herumzuspielen. Ich würde auch empfehlen, dass Sie Zeit damit verbringen, die Warteveranstaltungen für Ihre Instanz zu analysieren.

DBCC FreeProcccache

Mit diesem Befehl können Sie den gesamten Prozedur -Cache auf einen einzelnen Befehl löschen. Lesen Sie die Dokumentation auf jeden Fall vor, bevor Sie diesen Befehl verwenden. Lesen Sie den Abschnitt "Bemerkungen" einige Male.

Durch das Löschen des Verfahrens -Cache werden bei der nächsten Verwendung gespeicherte Verfahrens -Caches neu kompiliert. Dies könnte die Leistung beeinflussen. Sorgfältig verwenden!

Matt

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit dba.stackexchange
scroll top