Plan kılavuzlarını kullanarak sorgu parametreleştirme davranışını belirtme

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen Örneği

Veritabanı seçeneğini olarak PARAMETERIZATIONayarladığınızdaSIMPLE, SQL Server sorgu iyileştiricisi sorguları parametreleştirmeyi seçebilir. Bu parametreleştirme, sorgudaki tüm değişmez değerleri parametrelerle değiştirir. Bu işlem basit parametreleştirme olarak adlandırılır. Parametreleştirme etkin olduğunda SIMPLE , hangi sorguların parametrelendirilip hangi sorguların parametrelendirilmeyebileceğini denetleyemezsiniz. Ancak, PARAMETERIZATION veritabanı seçeneğini FORCED olarak ayarlayarak bir veritabanındaki tüm sorguların parametreli hale getirilmesini belirtebilirsiniz. Bu işlem zorlamalı parametreleştirme olarak adlandırılır.

Aşağıdaki yollarla plan kılavuzlarını kullanarak veritabanının parametreleştirme davranışını geçersiz kılabilirsiniz:

Seçenek Description
SIMPLE Zorlamalı parametreleştirmenin belirli bir sorgu sınıfında denendiğini belirtebilirsiniz. Bunu, sorgunun parametreli biçiminde bir ŞABLON plan kılavuzu oluşturarak ve sp_create_plan_guide saklı yordamında PARAMETERIZATION FORCED sorgu ipucunu belirterek yaparsınız. Bu tür bir plan kılavuzunu, tüm sorgular yerine yalnızca belirli bir sorgu sınıfında zorlamalı parametreleştirmeyi etkinleştirmenin bir yolu olarak düşünebilirsiniz. Daha fazla bilgi için bkz . Basit parametreleştirme.
FORCED Belirli bir sorgu sınıfı için zorlamalı parametreleştirme değil, yalnızca basit parametreleştirme girişiminde bulunacağını belirtebilirsiniz. Bunu, sorgunun zorunlu parametreleştirilmiş biçiminde bir TEMPLATE plan kılavuzu oluşturarak ve sp_create_plan_guide içinde PARAMETERIZATION SIMPLE sorgu ipucunu belirterek yaparsınız. Daha fazla bilgi için bkz . Zorlamalı parametreleştirme.

AdventureWorks2025 veritabanında aşağıdaki sorguyu göz önünde bulundurun:

SELECT pi.ProductID,
       SUM(pi.Quantity) AS Total
FROM Production.ProductModel AS pm
     INNER JOIN Production.ProductInventory AS pi
         ON pm.ProductModelID = pi.ProductID
WHERE pi.ProductID = 101
GROUP BY pi.ProductID, pi.Quantity
HAVING SUM(pi.Quantity) > 50;

Veritabanı yöneticisi olarak, veritabanındaki tüm sorgularda zorlamalı parametreleştirmeyi etkinleştirmek istemediğinizi belirlersiniz. Ancak, söz dizimsel olarak önceki sorguya eşdeğer olan ancak yalnızca sabit değişmez değerlerinde farklılık gösteren tüm sorgularda derleme maliyetlerinden kaçınmak istiyorsunuz. Başka bir deyişle, bu tür bir sorgu için bir sorgu planının yeniden kullanılması için sorgunun parametreleştirilmesini istiyorsunuz. Bu durumda aşağıdaki adımları tamamlayın:

  1. Sorgunun parametreli biçimini alın. Bu değeri sp_create_plan_guide içinde kullanmak üzere elde etmenin tek güvenli yolu, sp_get_query_template sistem saklı yordamını kullanmaktır.

  2. Sorgunun parametreli formu üzerinde, PARAMETERIZATION FORCED sorgu ipucunu belirterek plan kılavuzunu oluşturun.

    Önemli

    Sorguyu parametreleştirmenin bir parçası olarak, SQL Server değişmez değerin değerine ve boyutuna bağlı olarak değişmez değerlerin yerini alan parametrelere bir veri türü atar. Aynı işlem, sp_get_query_template öğesinin @stmt çıkış parametresine geçirilen sabit değişmezlerin değerleri için de gerçekleşir. sp_create_plan_guide öğesinin @params bağımsız değişkeninde belirtilen veri türü, SQL Server'ın sorguyu parametrelendirirken kullandığı veri türüyle eşleşmek zorunda olduğundan, sorgu için olası parametre değerlerinin tüm aralığını kapsamak üzere birden fazla plan kılavuzu oluşturmanız gerekebilir.

Aşağıdaki betik hem parametreli sorguyu almak hem de üzerinde bir plan kılavuzu oluşturmak için kullanılabilir:

DECLARE @stmt AS NVARCHAR (MAX);
DECLARE @params AS NVARCHAR (MAX);

EXECUTE sp_get_query_template
    N'SELECT pi.ProductID, SUM(pi.Quantity) AS Total
      FROM Production.ProductModel AS pm
      INNER JOIN Production.ProductInventory AS pi ON pm.ProductModelID = pi.ProductID
      WHERE pi.ProductID = 101
      GROUP BY pi.ProductID, pi.Quantity
      HAVING SUM(pi.Quantity) > 50',
@stmt OUTPUT, @params OUTPUT;

EXECUTE sp_create_plan_guide N'TemplateGuide1',
@stmt, N'TEMPLATE', NULL,
@params, N'OPTION(PARAMETERIZATION FORCED)';

Veritabanında zorlamalı parametreleştirme zaten etkinleştirildiyse, bunu belirli sorgular için geçersiz kılabilirsiniz. Örnek sorguyu ve sözdizimsel olarak eşdeğer olan sorguları basit parametreleştirme kurallarına göre parametreleştirmek için, OPTION yan tümcesinde PARAMETERIZATION FORCED yerine PARAMETERIZATION SIMPLE belirtin.

Not

TEMPLATE plan kılavuzları, ifadeleri yalnızca tek bir ifadeden oluşan toplu olarak gönderilen sorgularla eşleştirir. Birden çok deyim içeren toplu işlemler içindeki deyimler, TEMPLATE plan kılavuzları tarafından eşleştirilemez.