Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlar için geçerlidir:SQL Server
Azure 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:
Sorgunun parametreli biçimini alın. Bu değeri
sp_create_plan_guideiçinde kullanmak üzere elde etmenin tek güvenli yolu, sp_get_query_template sistem saklı yordamını kullanmaktır.Sorgunun parametreli formu üzerinde,
PARAMETERIZATION FORCEDsorgu 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@paramsbağı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.