Aracılığıyla paylaş


Saklı Yordamı Yeniden Derleme

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiAnaliz Platformu Sistemi (PDW)Microsoft Fabric'te SQL veritabanı

Bu makalede Transact-SQL kullanarak SQL Server'da bir saklı yordamın nasıl yeniden derleneceği açıklanır. Bunu yapmanın üç yolu vardır: WITH RECOMPILE yordam tanımındaki seçenek veya yordam çağrıldığında, tek tek deyimler üzerinde YENİDEN DERLEME sorgu ipucu ya da sp_recompile sistem saklı yordamını kullanarak.

Başlamadan Önce

Recommendations

  • Bir yordam ilk kez derlendiğinde veya yeniden derlendiğinde, yordamın sorgu planı veritabanının ve nesnelerinin geçerli durumu için iyileştirilir. Bir veritabanı verilerinde veya yapısında önemli değişikliklere uğrarsa, bir yordamı yeniden derlemek bu değişiklikler için yordamın sorgu planını güncelleştirir ve iyileştirir. Bu, prosedürün işleme performansını geliştirebilir.

  • Prosedürün yeniden derlemesinin zorlanması gereken zamanlar ve otomatik olarak gerçekleştiği zamanlar vardır. OTOMATIK yeniden derleme, SQL Server her yeniden başlatıldığında gerçekleşir. Ayrıca, yordam tarafından başvuruda bulunan temel bir tabloda fiziksel tasarım değişiklikleri yapıldığında da oluşur.

  • Bir yordamı yeniden derlemeye zorlamanın bir diğer nedeni de, yordam derlemesinin "parametre algılama" davranışına karşı koymaktır. SQL Server yordamları yürütürken, derleme sırasında yordam tarafından kullanılan tüm parametre değerleri sorgu planını oluşturmanın bir parçası olarak eklenir. Bu değerler, yordamın daha sonra çağrıldığı tipik değerler ise, yordam her derlenip yürütüldüğünde sorgu planından yararlanır. Yordamdaki parametre değerleri sık sık atipikse, yordamın yeniden derlenip farklı parametre değerlerine dayalı yeni bir plan uygulanması performansı artırabilir.

  • SQL Server, yordamların deyim düzeyinde yeniden derlemesini içerir. SQL Server saklı yordamları yeniden derlediğinde, tüm yordam yerine yalnızca yeniden derlemeye neden olan deyim derlenmiş olur.

  • Bir yordamdaki bazı sorgular düzenli olarak atipik veya geçici değerler kullanıyorsa, yordam performansı bu sorguların içindeki RECOMPILE sorgu ipucu kullanılarak geliştirilebilir. Tüm yordam yerine yalnızca sorgu ipucunu kullanan sorgular yeniden derleneceği için SQL Server'ın deyim düzeyinde yeniden derleme davranışı taklit edilir. Ancak, yordamın mevcut parametre değerlerini kullanmanın yanı sıra, RECOMPILE sorgu ipucu, saklı yordam içindeki tüm yerel değişkenlerin değerlerini de deyimi derlerken kullanır. Daha fazla bilgi için bkz. Sorgu İpucu (Transact-SQL).

Note

Azure Synapse Analytics ayrılmış ve sunucusuz havuzlarda saklı yordamlar önceden derlenmiş kod değildir ve bu nedenle yeniden derlenemez. Daha fazla bilgi için bkz. Azure Synapse Analytics'te ayrılmış SQL havuzları için saklı yordamları kullanma.

Security

Permissions

YENİDEN DERLEME seçeneğiyle

Yordam tanımı oluşturulduğunda bu seçenek kullanılırsa, veritabanında CREATE PROCEDURE izni ve yordamın oluşturulduğu şemada ALTER izni gerekir.

Bu seçenek bir EXECUTE deyiminde kullanılırsa, prosedür üzerinde EXECUTE izinleri gerektirir. EXECUTE deyiminin kendisinde izinler gerekli değildir, ancak EXECUTE deyiminde başvuruda bulunan yordamda yürütme izinleri gereklidir. Daha fazla bilgi için bkz . EXECUTE (Transact-SQL).

Yeniden Derle sorgu önerisi

Bu özellik, yordam oluşturulduğunda ve ipucu yordamdaki Transact-SQL deyimlerine eklendiğinde kullanılır. Bu nedenle, veritabanında CREATE PROCEDURE izni ve yordamın oluşturulduğu şemada ALTER izni gerektirir.

sp_recompile sistem saklı yordamı

Belirtilen prosedür üzerinde ALTER izni gerektirir.

Transact-SQL Kullanımı

  1. Veritabanı Altyapısı'na bağlanın.

  2. ** Standard çubuğundan Yeni Sorgu'ü seçin.

  3. Aşağıdaki örneği kopyalayıp sorgu penceresine yapıştırın ve Yürüt'e tıklayın. Bu örnek yordam tanımını oluşturur.

    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;  
    

WITH RECOMPILE seçeneğini kullanarak saklı yordamı yeniden derlemek için

Yeni Sorgu'yu seçin, ardından aşağıdaki kod örneğini kopyalayıp sorgu penceresine yapıştırın ve Yürüt'e tıklayın. Bu, yordamı gerçekleştirir ve yordamın sorgu planının yeniden derlenmesini sağlar.

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

Bir saklı yordamı yeniden derlemek için sp_recompile'i kullanarak

Yeni Sorgu'yu seçin, ardından aşağıdaki örneği kopyalayıp sorgu penceresine yapıştırın ve Yürüt'e tıklayın. Bu işlem yordamı yürütmez, ancak sorgu planının yordamın bir sonraki yürütülmesinde güncelleştirilmesi için yordamı yeniden derlenecek şekilde işaretler.

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

Sonraki Adımlar

Saklı Prosedür Oluştur
Saklı Yordamı Değiştir
Saklı Yordamı Yeniden Adlandırma
Saklı Yordam Tanımını Görüntüleme
Saklı Yordam Bağımlılıklarını Görüntüleme
PROSEDÜRÜ KALDIR (Transact-SQL)