Alle Objekte rekompilieren lassen
Der Ausführungsplan wird vom MS Sql Server einmalig beim Erstellen / Ändern eines Objektes erstellt. Durch neue oder geänderte Indizes, „verschieben“ der Verteilungsstatistik von Daten und anderen Umständen können sich diese Ausführungspläne als ungünstig erweisen. Man merkt es daran, das die Ausführung mit der Zeit auffällig langsamer wird, führt man das SQL Statement aber direkt als Query aus, ist es wesentlich schneller.
Abhilfe schafft hier, das Objekt neu kompilieren zu lassen, damit der Ausführungsplan neu erstellt wird; das erreicht man mit der Store Procedure sp_recompile.
Die SP für alle Objekte von Hand auszuführen, wäre etwas müßig, einfacher geht es per Cursor erledigen zu lassen. Um es etwas komfortabler/selektiver erledigen zu können, kann man im folgenden Script die gewünschten Objekttypen angeben.
-- Recompile Objects -- Je nach Option alle Stored Proc, Trigger und Views -- zur Neukompilierung bei der nächsten Ausführung -- markieren. Kann beliebig oft ausgeführt werden DECLARE @SP tinyint, @TR tinyint, @VW tinyint, @FN tinyint
DECLARE @Loop int, @Object sysname;
SET @SP = 1; -- 0 = Nein, 1 = Ja, Procedure recompile
SET @TR = 1; -- 0 = Nein, 1 = Ja, Trigger recompile
SET @VW = 1; -- 0 = Nein, 1 = Ja, Views recompile
SET @FN = 1; -- 0 = Nein, 1 = Ja, Functions recompile
DECLARE ObjCur CURSOR LOCAL FORWARD_ONLY
FOR SELECT QUOTENAME(SCH.name) + '.'
+ QUOTENAME(OBJ.name) AS ObjectName FROM sys.objects AS OBJ INNER JOIN
sys.schemas AS SCH ON OBJ.schema_id = SCH.schema_id WHERE (OBJ.type = 'TR' AND @TR <> 0)
OR (OBJ.type = 'P ' AND @SP <> 0) OR (OBJ.type = 'V ' AND @VW <> 0) OR (OBJ.type = 'FN' AND @VW <> 0); SET @Loop = 0;
-- Cursor über Objekte öffnen und abarbeiten OPEN ObjCur;
FETCH NEXT FROM ObjCur INTO @Object;
WHILE @@FETCH_STATUS = 0
BEGIN EXEC sp_recompile @objname = @Object; SET @Loop = @Loop + 1 FETCH NEXT FROM ObjCur INTO @Object; END;
-- Cursor schließen und entladen CLOSE ObjCur;
DEALLOCATE ObjCur;
-- Infoausgabe PRINT CONVERT(varchar, @Loop) + ' Objekte zur Neukompilierung markiert';
GO