Udostępnij za pomocą


Ponowne kompilowanie procedury składowanej

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAnalytics Platform System (PDW)Baza danych SQL w usłudze Microsoft Fabric

W tym artykule opisano sposób ponownego kompilowania procedury składowanej w programie SQL Server przy użyciu języka Transact-SQL. Istnieją trzy sposoby, aby to zrobić: WITH RECOMPILE opcja w definicji procedury lub po wywołaniu procedury, wskazówka zapytania RECOMPILE dla poszczególnych instrukcji lub przy użyciu sp_recompile procedury składowanej systemu.

Przed rozpoczęciem

Recommendations

  • Gdy procedura jest kompilowana po raz pierwszy lub ponownie skompilowana, plan zapytania procedury jest zoptymalizowany pod kątem bieżącego stanu bazy danych i jej obiektów. Jeśli w bazie danych zachodzą znaczące zmiany w danych lub strukturze, ponowne skompilowanie procedury aktualizuje i optymalizuje plan zapytania procedury dla tych zmian. Może to poprawić wydajność przetwarzania procedury.

  • Czasami ponowne skompilowanie procedury musi być wymuszone i czasami, gdy nastąpi to automatycznie. Automatyczne ponowne komkompilowanie odbywa się za każdym razem, gdy program SQL Server zostanie uruchomiony ponownie. Występuje również, jeśli tabela bazowa, do której odwołuje się procedura, uległa zmianie projektu fizycznego.

  • Innym powodem, dla którego należy wymusić ponowne kompilowanie procedury, jest przeciwdziałanie zachowaniu wynikającemu z analizy parametrów podczas kompilacji procedury. Gdy program SQL Server wykonuje procedury, wszystkie wartości parametrów, które są używane przez procedurę podczas kompilowania, są uwzględniane w ramach generowania planu zapytania. Jeśli te wartości reprezentują typowe wartości, z którymi procedura jest następnie wywoływana, procedura korzysta z planu zapytania za każdym razem, gdy kompiluje i wykonuje. Jeśli wartości parametrów w procedurze są często nietypowe, wymuszanie ponownego kompilowania procedury i nowy plan na podstawie różnych wartości parametrów może poprawić wydajność.

  • SQL Server oferuje ponowne kompilowanie procedur na poziomie instrukcji. Gdy program SQL Server ponownie kompiluje procedury składowane, kompilowana jest tylko instrukcja, która wywołała ponowną kompilację, a nie cała procedura.

  • Jeśli niektóre zapytania w procedurze regularnie używają nietypowych lub tymczasowych wartości, wydajność procedury można poprawić przy użyciu wskazówki zapytania RECOMPILE wewnątrz tych zapytań. Ponieważ tylko zapytania korzystające z wskazówki zapytania zostaną ponownie skompilowane zamiast pełnej procedury, zachowanie ponownej kompilacji na poziomie instrukcji programu SQL Server jest naśladowane. Oprócz używania bieżących wartości parametrów procedury, wskazówka zapytania RECOMPILE używa również wartości dowolnych zmiennych lokalnych wewnątrz procedury składowanej podczas kompilowania instrukcji. Aby uzyskać więcej informacji, zobacz Wskazówka dotycząca zapytań (Transact-SQL).

Note

W dedykowanych i bezserwerowych pulach usługi Azure Synapse Analytics procedury składowane nie są wstępnie skompilowanym kodem i dlatego nie można ich ponownie skompilować. Aby uzyskać więcej informacji, zobacz Używanie procedur składowanych dla dedykowanych pul SQL w usłudze Azure Synapse Analytics.

Zabezpieczenia

Permissions

z opcją PONOWNA KOMPILACJA

Jeśli ta opcja jest używana podczas tworzenia definicji procedury, wymaga uprawnienia CREATE PROCEDURE w bazie danych i uprawnienia ALTER w schemacie, w którym jest tworzona procedura.

Jeśli ta opcja jest używana w instrukcji EXECUTE, wymaga uprawnień EXECUTE w procedurze. Uprawnienia nie są wymagane w samej instrukcji EXECUTE, ale uprawnienia wykonywania są wymagane w procedurze, do której odwołuje się instrukcja EXECUTE. Aby uzyskać więcej informacji, zobacz EXECUTE (Transact-SQL).

Wskazówka zapytania RECOMPILE

Ta funkcja jest używana podczas tworzenia procedury, a wskazówka jest zawarta w instrukcjach Transact-SQL w procedurze. W związku z tym wymaga uprawnienia CREATE PROCEDURE w bazie danych i uprawnienia ALTER w schemacie, w którym jest tworzona procedura.

procedura składowana systemu sp_recompile

Wymaga uprawnienia ALTER w określonej procedurze.

Korzystanie z Transact-SQL

  1. Połącz się z silnikiem bazy danych.

  2. Na pasku Standard wybierz pozycję Nowe zapytanie.

  3. Skopiuj i wklej poniższy przykład w oknie zapytania, a następnie wybierz pozycję Wykonaj. W tym przykładzie utworzono definicję procedury.

    USE AdventureWorks2022;  
    GO  
    IF OBJECT_ID ( 'dbo.uspProductByVendor', 'P' ) IS NOT NULL   
        DROP PROCEDURE dbo.uspProductByVendor;  
    GO  
    CREATE PROCEDURE dbo.uspProductByVendor @Name varchar(30) = '%'  
    WITH RECOMPILE  
    AS  
        SET NOCOUNT ON;  
        SELECT v.Name AS 'Vendor name', p.Name AS 'Product name'  
        FROM Purchasing.Vendor AS v   
        JOIN Purchasing.ProductVendor AS pv   
          ON v.BusinessEntityID = pv.BusinessEntityID   
        JOIN Production.Product AS p   
          ON pv.ProductID = p.ProductID  
        WHERE v.Name LIKE @Name;  
    

Aby ponownie skompilować procedurę składowaną przy użyciu opcji WITH RECOMPILE

Wybierz pozycję Nowe zapytanie, a następnie skopiuj i wklej poniższy przykład kodu w oknie zapytania, a następnie wybierz pozycję Wykonaj. Spowoduje to wykonanie procedury oraz ponowne skompilowanie planu zapytania tej procedury.

USE AdventureWorks2022;  
GO  
EXECUTE HumanResources.uspProductByVendor WITH RECOMPILE;  
GO

Aby ponownie skompilować procedurę składowaną przy użyciu sp_recompile

Wybierz pozycję Nowe zapytanie, a następnie skopiuj i wklej poniższy przykład w oknie zapytania, a następnie wybierz pozycję Wykonaj. Ta procedura nie jest wykonywana, ale jest oznaczana do ponownego skompilowania, aby plan zapytania został zaktualizowany przy jej następnym wykonaniu.

USE AdventureWorks2022;  
GO  
EXEC sp_recompile N'dbo.uspProductByVendor';   
GO

Dalsze kroki

Utwórz procedurę składowaną
Zmodyfikuj procedurę składowaną
Zmienianie nazwy procedury składowanej
Wyświetl definicję procedury przechowywanej
Wyświetl zależności procedury składowanej
DROP PROCEDURE (Transact-SQL)