2016-08-01 9 views
0

Ich habe ein Problem auf SQL Server, in dem meine gespeicherte Prozedur nach einigen Tagen langsam wird.Erstellen Sie einen Scheduler, um gespeicherte Prozedur erneut zu kompilieren

Ich kam zu wissen, dass das erneute Kompilieren der gespeicherten Prozedur funktioniert. Ich möchte diese gespeicherte Prozedur jedoch nicht jedes Mal neu kompilieren, wenn sie aufgerufen wird.

Ist es eine gute Möglichkeit, einen Job auf SQL Server zu erstellen, der die folgende Anweisung ausführt?

EXEC sp_recompile N'SP_NAME'; 

Wird dies zu Leistungsproblemen führen?

Unten ist meine SP-Struktur.

@START_VALUE int=null, 
@END_VALUE int=null`enter code here` 
@UID NVARCHAR(MAX)=null, 
AS 
BEGIN 

    SELECT dbo.TABLE1.ID, 
       ROW_NUMBER() OVER (ORDER BY TABLE1.UPDATED_ON desc) AS RN, 
       CONVERT(VARCHAR(10), dbo.TABLE1.DATE, 101) AS TDATE, 
       CATEGORY 
       =(
       SELECT TOP 1 COLUMN1 FROM TABLE5 CT1 WHERE 
       TABLE1.CATEGORY = CT1.CATEGORY_ID 
      ) 
       , 
      TYPETEXT 
      =(
       SELECT TOP 1 COLUMN1 FROM TABLE6 CT1 WHERE 
       TABLE1.TYPE = CT1.TYPE_ID 
      ), 
       IMAGE = STUFF((SELECT DISTINCT ',' + CAST(pm.C1 AS varchar(12)) 
       FROM TABLE2 pm WHERE 
       pm.ID = TABLE1.ID AND pm.C1 IS NOT NULL AND pm.C1 <> '' 
       FOR XML PATH('')), 1, 1, '')INTO #tempRecords  
      FROM   dbo.TABLE1 
        WHERE 
        ((@UID is null OR dbo.TABLE1.ID = @UID) 
      ORDER BY TABLE1.UPDATED DESC  

     SELECT @count = COUNT(*) FROM #tempRecords; 
     SELECT *,CONVERT([int],@count) AS 'TOTAL_RECORDS' FROM #tempRecords 
     WHERE #tempRecords.RN BETWEEN CONVERT([bigint],@START_VALUE) AND CONVERT([bigint],@END_VALUE)  


END 

GO 
+2

Ich vermute, dass das Problem in der Prozedur ist. Durch eine geplante Neukompilierung wird das Symptom behoben, nicht die Ursache. Können Sie den Vorgang posten, damit wir Ihnen bei der Behebung helfen können? –

+0

Bitte überprüfen Sie diesen Artikel von Paul White. Sie können Option (neu kompilieren) auf bestimmte Anweisung, die Probleme, anstatt neu kompilierte gespeicherte Prozedur jedes Mal ..http: //sqlperformance.com/2013/08/t-sql-queries/parameter- sniffing-embedding-and-recompile-Optionen – TheGameiswar

+0

Randnotiz: Sie sollten ** nicht ** das Präfix 'sp_' für Ihre gespeicherten Prozeduren verwenden. Microsoft hat [dieses Präfix für seine eigene Verwendung reserviert (siehe * Gespeicherte Prozeduren benennen *)] (http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx), und Sie riskieren irgendwann in der Zukunft einen Namenskonflikt. [Es ist auch schlecht für die Leistung Ihrer gespeicherten Prozedur] (http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix). Es ist am besten, einfach 'sp_' zu vermeiden und etwas anderes als Präfix zu verwenden - oder gar kein Präfix! –

Antwort

0

auf den ersten: Ersetzen Sie Sub-Abfragen in der SELECT Anweisung von Sub-Abfragen in FROM Klausel.

Hier sind einige Optionen zum Beheben von 'Verlangsamung': 1. Wenn die Prozedur nicht häufig ausgeführt wird, versuchen Sie RECOMPILE Option zu verwenden. 2. Sehen Sie sich Statistiken an. Vielleicht wäre es einfacher, UPDATE STATISTICS SP dann neu kompilieren. 3. Wenn Statistiken das Problem darstellen, können Sie versuchen, gefilterte Statistiken zu verwenden. 4. Wenn keine dieser Optionen funktioniert, können Sie den Abfrageplan für diese Prozedur einfach automatisch aus dem Abfrage-Cache löschen und die Prozedur wird täglich neu kompiliert.

Zunächst jedoch die Hauptabfrage neu erstellen.