Megosztás a következőn keresztül:


Tárolt eljárás újrafordítása

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseFelügyelt Azure SQL-példányElemzési platformrendszer (PDW)SQL-adatbázis a Microsoft Fabricben

Ez a cikk bemutatja, hogyan lehet újrafordíteni egy tárolt eljárást az SQL Serveren a Transact-SQL használatával. Ezt három módon teheti meg: WITH RECOMPILE az eljárás definíciójában vagy az eljárás meghívásakor, a RECOMPILE lekérdezési utasítás használatával egyes utasításokra, vagy a sp_recompile rendszerben tárolt eljárás használatával.

Mielőtt hozzákezdene

Recommendations

  • Amikor egy eljárás első alkalommal van lefordítva vagy újrafordított, az eljárás lekérdezési terve az adatbázis és az objektumok aktuális állapotához lesz optimalizálva. Ha egy adatbázis adataiban vagy szerkezetében jelentős változások történnek, az eljárás újrafordítása frissíti és optimalizálja az eljárás lekérdezési tervét ezekhez a módosításokhoz. Ez javíthatja az eljárás feldolgozási teljesítményét.

  • Vannak olyan esetek, amikor az eljárás újrafordítását kényszeríteni kell, máskor pedig automatikusan. Amikor az SQL Server újraindul, automatikusan megtörténik az újrafordítás. Akkor is előfordul, ha az eljárás által hivatkozott mögöttes tábla fizikai tervezési változásokon ment keresztül.

  • Egy eljárás újrafordításra kényszerítésének másik oka az eljárás fordításának "paraméterszimatolás" viselkedésének ellensúlyozása. Amikor az SQL Server végrehajtja az eljárásokat, az eljárás által fordításkor használt paraméterértékek a lekérdezési terv generálásának részeként lesznek belefoglalva. Ha ezek az értékek azokat a tipikus értékeket jelölik, amelyekkel az eljárást később meghívják, akkor az eljárás a lekérdezési terv előnyeit élvezi minden alkalommal, amikor lefordítja és végrehajtja. Ha az eljárás paraméterértékei gyakran atipikusak, az eljárás újrafordításának kényszerítése és a különböző paraméterértékeken alapuló új terv növelheti a teljesítményt.

  • Az SQL Server az eljárások utasításszintű újrafordításával rendelkezik. Ha az SQL Server újrafordítást végez a tárolt eljárásokon, a teljes eljárás helyett csak az újrafordítást okozó utasítás lesz lefordítva.

  • Ha egy eljárás egyes lekérdezései rendszeresen atipikus vagy ideiglenes értékeket használnak, az eljárás teljesítménye javítható a lekérdezésekben található RECOMPILE lekérdezési tipp használatával. Mivel a teljes eljárás helyett csak a lekérdezési tippet használó lekérdezések lesznek újrafordítve, az SQL Server utasításszintű újrafordítási viselkedését utánozza a rendszer. Az eljárás aktuális paraméterértékeinek használata mellett azonban a RECOMPILE lekérdezési tipp a tárolt eljárásban lévő helyi változók értékeit is használja az utasítás lefordításakor. További információ: Lekérdezési tipp (Transact-SQL).

Note

Az Azure Synapse Analytics dedikált és kiszolgáló nélküli készleteiben a tárolt eljárások nem előre lefordított kódok, ezért nem fordíthatók újra. További információ: Tárolt eljárások használata dedikált SQL-készletekhez az Azure Synapse Analyticsben.

Biztonság

Permissions

ÚJRAFORDÍTÁS OPCIÓval

Ha ezt a beállítást az eljárásdefiníció létrehozásakor használják, akkor CREATE PROCEDURE engedélyre van szükség az adatbázisban, és ALTER engedélyre azon a sémán, amelyben az eljárás létrejön.

Ha ez a beállítás egy EXECUTE utasításban van használatban, az eljáráshoz VÉGREHAJTÁSI engedélyekre van szükség. Az EXECUTE utasításhoz nincs szükség engedélyekre, de végrehajtási engedélyekre van szükség az EXECUTE utasításban hivatkozott eljáráshoz. További információ: EXECUTE (Transact-SQL).

RECOMPILE lekérdezési utasítás

Ez a funkció akkor használatos, amikor az eljárás létrejön, és a tipp szerepel Transact-SQL utasításokban az eljárásban. Ezért create procedure engedélyt igényel az adatbázisban, és alter engedélyt arra a sémára, amelyben az eljárás létrejön.

sp_recompile rendszer által tárolt eljárás

A megadott eljáráshoz ALTER-engedély szükséges.

Transact-SQL használata

  1. Csatlakozzon az adatbázismotorhoz.

  2. A Standard sávon válassza Új lekérdezéslehetőséget.

  3. Másolja és illessze be a következő példát a lekérdezési ablakba, és válassza az Végrehajtás lehetőséget. Ez a példa létrehozza az eljárásdefiníciót.

    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;  
    

Tárolt eljárás újrafordítása a WITH RECOMPILE beállítással

Válassza az Új lekérdezés lehetőséget, majd másolja és illessze be a következő kódpéldát a lekérdezés ablakába, és válassza a Végrehajtás lehetőséget. Ez végrehajtja az eljárást, és újrafordítja az eljárás lekérdezési tervét.

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

Tárolt eljárás újrafordítása sp_recompile használatával

Válassza az Új lekérdezés lehetőséget, majd másolja és illessze be a következő példát a lekérdezési ablakba, és válassza a Végrehajtás lehetőséget. Ez nem hajtja végre az eljárást, de megjelöli az újrafordításhoz szükséges eljárást, hogy a lekérdezésterv a következő alkalommal frissüljön, amikor az eljárást végrehajtja.

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

Következő lépések

Tárolt eljárás létrehozása
Tárolt eljárás módosítása
Tárolt eljárás átnevezése
Tárolt eljárás definíciójának megtekintése
Tárolt eljárás függőségeinek megtekintése
ELJÁRÁS ELTÁVOLÍTÁSA (Transact-SQL)