Overblog Folge diesem Blog
Edit post Administration Create my blog
Blog von Olaf Helper

Alle Objekte rekompilieren lassen

23. Februar 2009 , Geschrieben von Olaf Helper Veröffentlicht in #T-SQL

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 

Diesen Post teilen

Repost 0

Kommentiere diesen Post