Share via


sp_create_plan_guide (Transact-sql)

Bir veritabanında sorgular sorgu ipuçları ya da gerçek sorgu planları ilişkilendirmek için bir plan Kılavuzu oluşturur. Plan kılavuzları hakkında daha fazla bilgi için bkz: Plan kılavuzları.

Konu bağlantısı simgesi Transact-SQL Sözdizim Kuralları

Sözdizimi

sp_create_plan_guide [ @name = ] N'plan_guide_name'
    , [ @stmt = ] N'statement_text'
    , [ @type = ] N'{ OBJECT | SQL | TEMPLATE }'
    , [ @module_or_batch = ]
      { 
                    N'[ schema_name. ] object_name'
        | N'batch_text'
        | NULL
      }
    , [ @params = ] { N'@parameter_name data_type [ ,...n ]' | NULL } 
    , [ @hints = ] { N'OPTION ( query_hint [ ,...n ] )' 
                 | N'XML_showplan'
                 | NULL }

Bağımsız değişkenler

  • @name =n'plan_guide_name'
    Plan Kılavuzu adını oluşturur. Plan Kılavuzu adları geçerli veritabanına kapsamına eklenir. plan_guide_namekurallarına uymak zorundadır tanımlayıcıları ve sayı işareti (#) ile başlayamaz. En uzun plan_guide_name124 karakterden.

  • @stmt =n'statement_text'
    Olan bir Transact-SQLkarşı plan kılavuz oluşturmak için ifade. Ne zaman SQL Serveruygun bir sorgu en iyi duruma getiricisi tanıdığı sorgu statement_text, plan_guide_namealır etkisi. Başarılı olmak için bir plan kılavuz oluşturmak için statement_texttarafından belirtilen içeriği görünmelidir @ türü, @ module_or_batch, ve @ params parametreleri.

    statement_textkarşılık gelen deyimi içinde toplu sağlanan veya tanımlanan modülü ile eşleşen sorgu iyileştirici verir şekilde sağlanmalıdır @ module_or_batch ve @ params. Daha fazla bilgi için "Uyarılar" konusuna bakın. Bölüm. Boyutunu statement_textyalnızca sunucu kullanılabilir bellek tarafından sınırlandırılır.

  • @type = n'{nesne | SQL | Şablon}'
    Hangi varlık türü statement_textgörünür. Bu bağlamda eşleşen belirtir statement_text için plan_guide_name.

    • NESNE
      Gösterir statement_text bağlamında görünür bir Transact-SQLsaklı yordam, skalar fonksiyonunu, çoklu deyimli tablo değerli işlev veya Transact-SQLdml tetikleyici geçerli veritabanında.

    • SQL
      Gösterir statement_text tek başına deyimini veya toplu iş için gönderilebilir bağlamında görünür SQL Serverherhangi bir mekanizma ile. Transact-SQLortak dil çalışma zamanı (clr) nesneleri veya genişletilmiş saklı yordamlar veya exec kullanarak sunulan beyanlar n'sql_string', ve sunucu üzerinde toplu olarak işlenir, bu nedenle olarak tespit edilmelidir @ türü ='sql'.  sql belirtilirse, sorgu ipucu PARAMETERIZATION {forced | BASİT} belirtilen içinde @ ipuçları parametresi.

    • ŞABLON
      Plan Kılavuzu uygulandığı belirtilen form parameterizes herhangi bir sorgu gösterir statement_text. ŞABLON belirtilmezse, yalnızca PARAMETERIZATION {forced | BASİT} sorgu ipucu olarak belirtilebilir @ ipuçları parametresi. template planı kılavuzları hakkında daha fazla bilgi için bkz: Plan kılavuzları kullanarak sorgu Parameterization davranışı belirtme.

  • @module\_or\_batch ={ N'schema_name. ] object_name' | N'batch_text' | NULL}
    Nesnenin adını belirten statement_textgörünür, ya da toplu metni hangi statement_textgörünür. Toplu metni kullanın ekleyemezsiniz database deyimi.

    Bir uygulamadan gönderilen toplu eşleştirmek için bir plan Kılavuzu için batch_text aynı biçimde, sağlanan karakter karakterine, o gönderilir gibi SQL Server. İç dönüşüm yok, bu maçı kolaylaştırmak için gerçekleştirilir. Daha fazla bilgi için, Yorumlar bölümüne bakın.

    schema_name. object_name adını belirtir bir Transact-SQLsaklı yordam, skalar fonksiyonunu, çoklu deyimli tablo değerli işlev veya Transact-SQLdml tetikleyici içeren statement_text. Eğer schema_name belirtilmemiş, schema_name, geçerli kullanıcı şeması kullanır. null belirtilirse ve @ türü = 'sql', değeri @ module_or_batch değerine ayarlanır @ stmt. Eğer @ türü = 'template**'**, @ module_or_batch null olmalıdır.

  • @params = { N'@parameter_name data_type ,...n ' | NULL}
    Katıştırılmış tüm parametreleri tanımları belirtir statement_text. @ params yalnızca aşağıdakilerden biri doğru olduğunda geçerlidir:

    • @ türü = 'sql' ya 'template'. Eğer 'template', @ params null olmalıdır.

    • statement_textkullanarak gönderilen sp_executesqliçin bir değer @ params parametresi belirtilirse, ya da SQL Serverdahili olarak görüneceği şekilde parameterizing sonra bir açıklama gönderen Parametreleştirilmiş sorguları sunulması veritabanı API (dahil olmak üzere odbc, ole db ve ado.net) görünür SQL Servergibi aramalar için sp_executesqlveya API sunucu imleç rutinleri; Bu nedenle, onlar da sql veya template tarafından eşleştirilebilir planı kılavuzları.

    @parameter\_name data_type o gönderilir gibi tam aynı biçimde sağlanmalı SQL Serverkullanarak sp_executesql ya da dahili olarak parameterization sonra gönderilmektedir. Daha fazla bilgi için, Yorumlar bölümüne bakın. Toplu iş parametreleri içermiyorsa, boş belirtilmelidir. Boyutunu @ params yalnızca kullanılabilir sunucu belleğiyle sınırlıdır.

  • @hints = { N'OPTION (query_hint ,...n )' | N'XML_showplan' | NULL}

    • N'OPTION (query_hint ,...n )
      Eşleşen bir sorgu eklemek için bir seçenek yan belirtir @ stmt. @ İpuçları sözdizimsel bir OPTION yan tümcesi select deyimi içinde aynı olmalı ve sorgu ipuçları geçerli herhangi bir dizi içerebilir.

    • N'XML_showplan'
      Bir ipucu olarak uygulanacak sorgu xml biçiminde planıdır.

      xml Showplan bir değişkene atama öneririz; Aksi takdirde, onları başka bir tek tırnak işareti ile önceki tarafından Showplan herhangi bir tek tırnak kaçmak gerekir. Örneğin e. bkz.

    • NULL
      Varolan herhangi bir ipucu sorgu seçeneği yan tümcesinde belirtilen sorgu için uygulanmaz gösterir. Daha fazla bilgi için, bkz. OPTION Yantümcesi (Transact-sql).

Açıklamalar

Bağımsız sp_create_plan_guidegösterilen sırayla sağlanmalıdır. Ne zaman, sağladığınız parametreleri için değerleri sp_create_plan_guide, tüm parametre adlarını açıkça belirtilmesi gerekir, ya da hiç yok. Örneğin, eğer @name =, sonra belirtilen @stmt =, @type =, vb. Ayrıca belirtilmelidir. Aynı şekilde, eğer @name =ihmal ve yalnızca parametre değeri sağlanır, kalan parametre adları da atlanmış olmalıdır ve yalnızca değerleri sağlanan. Bağımsız değişken adı sözdizimini anlamak amacıyla tanımlayıcı yalnızca amaçlıdır. SQL ServerBelirtilen parametre adı parametre adının kullanıldığı pozisyonda adıyla eşleşen doğrulamaz.

Birden çok nesne ya da sql plan Kılavuzu için aynı sorgu ve toplu veya modül oluşturabilirsiniz. Ancak, tek bir plan Kılavuzu, herhangi bir zamanda etkinleştirilebilir.

Türü için nesne oluşturulamıyor kılavuzları planladığınız bir @ module_or_batch başvuru bir saklı yordam, işlev veya WITH ENCRYPTION yan tümcesini veya geçici belirtir dml tetikleyici değeri.

Bırakın veya bir işlev, saklı yordam veya bir plan Kılavuzu tarafından başvurulan dml tetikleyici değiştirmek çalışıyorum, etkin veya devre dışı, neden bir hata. Bir plan Kılavuzu tarafından başvurulan bir tetikleyici tanımlanmış olan bir tablo bırakma çalışırken de bir hata neden olur.

[!NOT]

Plan kılavuzları her sürümünde kullanılan Microsoft SQL Server. Sürümü tarafından desteklenen özellikleri listesi için SQL Serverbakın SQL Server 2012 Sürümleri Tarafından Desteklenen Özellikler. Plan kılavuzları, herhangi bir baskı olarak görülebilir. Plan kılavuzları için herhangi bir sürümü içeren bir veritabanı da ekleyebilirsiniz. Plan kılavuzları kalır bozulmadan geri yüklemek veya bir veritabanını iliştirmek için yükseltilmiş sürümü SQL Server. Sunucu yükseltme yaptıktan sonra her veritabanı planı kılavuzları cazibe doğrulamanız gerekir.

Kılavuzu gereksinimleri eşleşen planlayın

Belirttiğiniz planı kılavuzları için @ türü = 'sql' veya @ türü = 'template' başarıyla sorgu değerlerini eşleştirmek için batch_textve @parameter\_name data_type ,...n uygulama tarafından gönderilen karşılıkları tam olarak aynı biçimde sağlanmalıdır. Bu toplu metni sağlamak gerekir anlamına gelir tam olarak SQL Serverderleyici görüneceği şekilde alır Gerçek toplu ve parametre metni yakalamak için kullanabileceğiniz SQL Server Profiler. Daha fazla bilgi için, bkz. Oluşturmak ve sınamak için SQL Server Profiler'I kullanma planı kılavuzları.

Ne zaman @ türü = 'sql' ve @ module_or_batch için null değeri ayarlanır @ module_or_batch değerine ayarlanır @ stmt. Bu değeri anlamına statement_texttam olarak aynı biçimde, sağlanmalıdır karakteri karakterine, o gönderilir gibi SQL Server. İç dönüşüm yok, bu maçı kolaylaştırmak için gerçekleştirilir.

Ne zaman SQL Servereşleştiği statement_textiçin batch_textve @parameter\_name data_type ,...n , ya da eğer @ türü = **'**nesne', metne karşılık gelen sorgu içinde object_name, aşağıdaki dize öğelerini dikkate alınmaz:

  • Dize içinde boşluk karakterleri (sekme, boşluk, satırbaşları veya satır besleme).

  • Comments (-- or /* */).

  • Sondaki noktalı

Örneğin, SQL Servermaç statement_textdize N'SELECT * FROM T WHERE a = 10'Aşağıdaki batch_text:

N'SELECT *

FROM T

WHERE a=10'

Ancak, aynı dizeyi bu eşleştirilecektir değil batch_text:

N'SELECT * FROM T WHERE b = 10'

SQL Serversatır başı satır besleme ve ilk sorgunun içindeki boşluk karakterlerini yoksayar. İkinci sorgu sırası WHERE b = 10dan farklı yorumlanan WHERE a = 10. Durumda ve aksan-(veritabanı harmanlama duyarlı olsa bile) duyarlı, dışında anahtar kelime, harf duyarsız olduğu eşlemesidir. Eşleşen anahtar kelimeler için kısaltılmış biçimleri çok duyarsızdır. Örneğin, anahtar kelimeler EXECUTE, EXEC, ve executeeşdeğer kabul edilir.

Plan önbelleği planı Kılavuzu etkisi

Bir plan Kılavuzu üzerinde modül oluşturma sorgu planı bu modül için planı önbellekten kaldırır. NESNE veya sql türü bir plan Kılavuzu üzerinde bir toplu işlem oluşturmak için aynı karma değerine sahip bir toplu iş sorgu planı kaldırır. Plan Kılavuzu türü template oluşturma tüm tek deyimli toplu o veritabanındaki planı önbellekten kaldırır.

İzinler

Bir plan Kılavuzu türü nesne oluşturmak için başvurulan nesne üzerinde alter izni gerektirir. Bir plan Kılavuzu türü sql veya şablon oluşturmak için geçerli veritabanını alter izni gerektirir.

Örnekler

A.Bir saklı yordam bir sorgu için object türündeki bir plan Kılavuzu oluşturma

Aşağıdaki örnek, uygulama tabanlı saklı yordam bağlamında yürütülen bir sorguyla eşleşen bir plan Kılavuzu oluşturur ve uygular OPTIMIZE FORİpucu sorgu.

Saklı yordam aşağıdadır:

IF OBJECT_ID(N'Sales.GetSalesOrderByCountry', N'P') IS NOT NULL
    DROP PROCEDURE Sales.GetSalesOrderByCountry;
GO
CREATE PROCEDURE Sales.GetSalesOrderByCountry 
    (@Country_region nvarchar(60))
AS
BEGIN
    SELECT *
    FROM Sales.SalesOrderHeader AS h 
    INNER JOIN Sales.Customer AS c ON h.CustomerID = c.CustomerID
    INNER JOIN Sales.SalesTerritory AS t 
        ON c.TerritoryID = t.TerritoryID
    WHERE t.CountryRegionCode = @Country_region;
END
GO

IF OBJECT_ID(N'Sales.GetSalesOrderByCountry', N'P') IS NOT NULL
    DROP PROCEDURE Sales.GetSalesOrderByCountry;
GO
CREATE PROCEDURE Sales.GetSalesOrderByCountry 
    (@Country_region nvarchar(60))
AS
BEGIN
    SELECT *
    FROM Sales.SalesOrderHeader AS h 
    INNER JOIN Sales.Customer AS c ON h.CustomerID = c.CustomerID
    INNER JOIN Sales.SalesTerritory AS t 
        ON c.TerritoryID = t.TerritoryID
    WHERE t.CountryRegionCode = @Country_region;
END
GO

Saklı yordamın sorgu oluşturulan plan Kılavuzu aşağıdadır:

EXEC sp_create_plan_guide 
    @name =  N'Guide1',
    @stmt = N'SELECT *
              FROM Sales.SalesOrderHeader AS h 
              INNER JOIN Sales.Customer AS c 
                 ON h.CustomerID = c.CustomerID
              INNER JOIN Sales.SalesTerritory AS t 
                 ON c.TerritoryID = t.TerritoryID
              WHERE t.CountryRegionCode = @Country_region',
    @type = N'OBJECT',
    @module_or_batch = N'Sales.GetSalesOrderByCountry',
    @params = NULL,
    @hints = N'OPTION (OPTIMIZE FOR (@Country_region = N''US''))';

EXEC sp_create_plan_guide 
    @name =  N'Guide1',
    @stmt = N'SELECT *
              FROM Sales.SalesOrderHeader AS h 
              INNER JOIN Sales.Customer AS c 
                 ON h.CustomerID = c.CustomerID
              INNER JOIN Sales.SalesTerritory AS t 
                 ON c.TerritoryID = t.TerritoryID
              WHERE t.CountryRegionCode = @Country_region',
    @type = N'OBJECT',
    @module_or_batch = N'Sales.GetSalesOrderByCountry',
    @params = NULL,
    @hints = N'OPTION (OPTIMIZE FOR (@Country_region = N''US''))';

B.Tek başına bir sorgu için sql türü bir plan Kılavuzu oluşturma

Aşağıdaki örnek, kullanan bir uygulama tarafından gönderilen bir toplu iş sorgu eşleştirmek için bir plan Kılavuzu oluşturur sp_executesqlsistem saklı yordamını.

Toplu işte:

SELECT TOP 1 * FROM Sales.SalesOrderHeader ORDER BY OrderDate DESC;

SELECT TOP 1 * FROM Sales.SalesOrderHeader ORDER BY OrderDate DESC;

Bu sorgu oluşturulan paralel yürütme planı engellemek için aşağıdaki plan Kılavuzu oluşturun:

EXEC sp_create_plan_guide 
    @name = N'Guide1', 
    @stmt = N'SELECT TOP 1 * 
              FROM Sales.SalesOrderHeader 
              ORDER BY OrderDate DESC', 
    @type = N'SQL',
    @module_or_batch = NULL, 
    @params = NULL, 
    @hints = N'OPTION (MAXDOP 1)';

EXEC sp_create_plan_guide 
    @name = N'Guide1', 
    @stmt = N'SELECT TOP 1 * 
              FROM Sales.SalesOrderHeader 
              ORDER BY OrderDate DESC', 
    @type = N'SQL',
    @module_or_batch = NULL, 
    @params = NULL, 
    @hints = N'OPTION (MAXDOP 1)';

C.Bir plan Kılavuzu türü bir sorgu parametreli formu şablonu oluşturma

Aşağıdaki örnek, belirtilen forma parameterizes ve yönlendiren bir sorguyla eşleşen bir plan Kılavuzu oluşturur SQL Serversorgu parameterization zorlamak için. Aşağıdaki iki sorgu sözdizimi kurallarına göre eşdeğer olmakla birlikte, sadece kendi sabit hazır bilgi değerleri farklıdır.

SELECT * FROM AdventureWorks2012.Sales.SalesOrderHeader AS h
INNER JOIN AdventureWorks2012.Sales.SalesOrderDetail AS d 
    ON h.SalesOrderID = d.SalesOrderID
WHERE h.SalesOrderID = 45639;

SELECT * FROM AdventureWorks2012.Sales.SalesOrderHeader AS h
INNER JOIN AdventureWorks2012.Sales.SalesOrderDetail AS d 
    ON h.SalesOrderID = d.SalesOrderID
WHERE h.SalesOrderID = 45640;

SELECT * FROM AdventureWorks2012.Sales.SalesOrderHeader AS h
INNER JOIN AdventureWorks2012.Sales.SalesOrderDetail AS d 
    ON h.SalesOrderID = d.SalesOrderID
WHERE h.SalesOrderID = 45639;

SELECT * FROM AdventureWorks2012.Sales.SalesOrderHeader AS h
INNER JOIN AdventureWorks2012.Sales.SalesOrderDetail AS d 
    ON h.SalesOrderID = d.SalesOrderID
WHERE h.SalesOrderID = 45640;

Sorgu parametreli formdaki plan Kılavuzu aşağıdadır:

EXEC sp_create_plan_guide 
    @name = N'TemplateGuide1',
    @stmt = N'SELECT * FROM AdventureWorks2012.Sales.SalesOrderHeader AS h
              INNER JOIN AdventureWorks2012.Sales.SalesOrderDetail AS d 
                  ON h.SalesOrderID = d.SalesOrderID
              WHERE h.SalesOrderID = @0',
    @type = N'TEMPLATE',
    @module_or_batch = NULL,
    @params = N'@0 int',
    @hints = N'OPTION(PARAMETERIZATION FORCED)';

EXEC sp_create_plan_guide 
    @name = N'TemplateGuide1',
    @stmt = N'SELECT * FROM AdventureWorks2012.Sales.SalesOrderHeader AS h
              INNER JOIN AdventureWorks2012.Sales.SalesOrderDetail AS d 
                  ON h.SalesOrderID = d.SalesOrderID
              WHERE h.SalesOrderID = @0',
    @type = N'TEMPLATE',
    @module_or_batch = NULL,
    @params = N'@0 int',
    @hints = N'OPTION(PARAMETERIZATION FORCED)';

Önceki örnekte, değeri @stmtparametre sorgu parametreli formu olur. Kullanmak için bu değer elde etmek için yalnızca güvenilir bir şekilde sp_create_plan_guidekullanmak sp_get_query_template sistem saklı yordamını. Aşağıdaki komut dosyası, her iki Parametreli sorgu elde ve bir plan Kılavuzu üzerinde oluşturmak için kullanılabilir.

DECLARE @stmt nvarchar(max);
DECLARE @params nvarchar(max);
EXEC sp_get_query_template 
    N'SELECT * FROM AdventureWorks2012.Sales.SalesOrderHeader AS h
      INNER JOIN AdventureWorks2012.Sales.SalesOrderDetail AS d 
          ON h.SalesOrderID = d.SalesOrderID
      WHERE h.SalesOrderID = 45639;',
    @stmt OUTPUT, 
    @params OUTPUT
EXEC sp_create_plan_guide N'TemplateGuide1', 
    @stmt, 
    N'TEMPLATE', 
    NULL, 
    @params, 
    N'OPTION(PARAMETERIZATION FORCED)';

DECLARE @stmt nvarchar(max);
DECLARE @params nvarchar(max);
EXEC sp_get_query_template 
    N'SELECT * FROM AdventureWorks2012.Sales.SalesOrderHeader AS h
      INNER JOIN AdventureWorks2012.Sales.SalesOrderDetail AS d 
          ON h.SalesOrderID = d.SalesOrderID
      WHERE h.SalesOrderID = 45639;',
    @stmt OUTPUT, 
    @params OUTPUT
EXEC sp_create_plan_guide N'TemplateGuide1', 
    @stmt, 
    N'TEMPLATE', 
    NULL, 
    @params, 
    N'OPTION(PARAMETERIZATION FORCED)';
Önemli notÖnemli

Sabit harflerin değerini @stmtparametresi geçirilen sp_get_query_templateveri türü sabit değer yerine parametre için seçilen etkileyebilir. Bu plan Kılavuzu eşleşen etkileyecektir. Farklı parametre değer aralıkları işlemek için birden fazla plan kılavuz oluşturmak zorunda kalabilirsiniz.

D.Bir API imleç isteği kullanarak gönderilen sorgu planı Kılavuzu oluşturma

API sunucu imleç rutin gönderilen sorguları planı kılavuzları eşleştirir. Bu yordamlar dahil sp_cursorprepare, sp_cursorprepexec, ve sp_cursoropen. ado, ole db ve odbc API'ları sık kullanan uygulamalar etkileşimde SQL ServerAPI sunucu imleçler kullanarak. Sen-ebilmek görmek API sunucu imleç yordamları çağırma SQL Server Profilerizlerini inceleyen tarafından RPC:Startingprofiler izleme olayı.

Aşağıdaki verileri görünür varsayalım bir RPC:Startingprofiler izleme olayı ile bir plan Kılavuzu ayarlamak istediğiniz sorgu için:

DECLARE @p1 int;
SET @p1=-1;
DECLARE @p2 int;
SET @p2=0;
DECLARE @p5 int;
SET @p5=4104;
DECLARE @p6 int;
SET @p6=8193;
DECLARE @p7 int;
SET @p7=0;
EXEC sp_cursorprepexec @p1 output,@p2 output,N'@P1 varchar(255),@P2 varchar(255)',N'SELECT * FROM Sales.SalesOrderHeader h INNER JOIN AdventureWorks2012.Sales.SalesOrderDetail AS d ON h.SalesOrderID = d.SalesOrderID WHERE h.OrderDate BETWEEN @P1 AND @P2',@p5 OUTPUT,@p6 OUTPUT,@p7 OUTPUT,'20040101','20050101'
SELECT @p1, @p2, @p5, @p6, @p7;

DECLARE @p1 int;
SET @p1=-1;
DECLARE @p2 int;
SET @p2=0;
DECLARE @p5 int;
SET @p5=4104;
DECLARE @p6 int;
SET @p6=8193;
DECLARE @p7 int;
SET @p7=0;
EXEC sp_cursorprepexec @p1 output,@p2 output,N'@P1 varchar(255),@P2 varchar(255)',N'SELECT * FROM Sales.SalesOrderHeader h INNER JOIN AdventureWorks2012.Sales.SalesOrderDetail AS d ON h.SalesOrderID = d.SalesOrderID WHERE h.OrderDate BETWEEN @P1 AND @P2',@p5 OUTPUT,@p6 OUTPUT,@p7 OUTPUT,'20040101','20050101'
SELECT @p1, @p2, @p5, @p6, @p7;

Sen fark planı SELECTaramak için sorgu sp_cursorprepexecBirleştirme katıl, ancak karma birleştirme kullanmak istediğiniz kullanmaktır. Kullanılarak gönderilen sorgu sp_cursorprepexec, hem sorgu dizesi, hem de bir parametre dizesini parametrelenmiştir. Planı seçme sorgusu kullanarak değiştirmek için aşağıdaki plan Kılavuzu oluşturabilirsiniz ve tam olarak göründükleri gibi parametre dizeleri karakter karakter, çağrı için sp_cursorprepexec.

EXEC sp_create_plan_guide 
    @name = N'APICursorGuide',
    @stmt = N'SELECT * FROM Sales.SalesOrderHeader AS h 
              INNER JOIN Sales.SalesOrderDetail AS d 
                ON h.SalesOrderID = d.SalesOrderID 
              WHERE h.OrderDate BETWEEN @P1 AND @P2',
    @type = N'SQL',
    @module_or_batch = NULL,
    @params = N'@P1 varchar(255),@P2 varchar(255)',
    @hints = N'OPTION(HASH JOIN)';

EXEC sp_create_plan_guide 
    @name = N'APICursorGuide',
    @stmt = N'SELECT * FROM Sales.SalesOrderHeader AS h 
              INNER JOIN Sales.SalesOrderDetail AS d 
                ON h.SalesOrderID = d.SalesOrderID 
              WHERE h.OrderDate BETWEEN @P1 AND @P2',
    @type = N'SQL',
    @module_or_batch = NULL,
    @params = N'@P1 varchar(255),@P2 varchar(255)',
    @hints = N'OPTION(HASH JOIN)';

Bu sorgu uygulama tarafından sonraki yürütmeler Bu plan Kılavuzu tarafından etkilenir ve karma birleştirme sorgu işlemek için kullanılacaktır.

E.Önbelleğe alınmış planından xml Showplan alarak bir plan Kılavuzu oluşturma

Aşağıdaki örnek, basit bir ad hoc sql deyimi için bir plan Kılavuzu oluşturur. Bu deyim için istenen sorgu planı plan Kılavuzu'nda doğrudan sorgu xml Showplan belirterek sağlanan @hintsparametresi. Örneğin, önce bir planı plan önbelleğinde oluşturmak için sql deyimini yürütür. Bu örnek amacıyla oluşturulan planı istenen plan ve hiçbir ek sorgu ayarlama gerekli olduğunu kabul edilir. Sorgu xml Showplan sorgulayarak elde edilen sys.dm_exec_query_stats, sys.dm_exec_sql_text, ve sys.dm_exec_text_query_plandinamik yönetimi görünümleri ve atanan @xml\_showplandeğişkeni. @xml\_showplanDeğişken için sonra olarak geçirilen sp_create_plan_guidedeyimi @hintsparametresi. Ya da, sen bir plan Kılavuzu bir sorgu planı plan önbelleğinde kullanarak oluşturabilirsiniz sp_create_plan_guide_from_handle saklı yordamı.

USE AdventureWorks2012;
GO
SELECT City, StateProvinceID, PostalCode FROM Person.Address ORDER BY PostalCode DESC;
GO
DECLARE @xml_showplan nvarchar(max);
SET @xml_showplan = (SELECT query_plan
    FROM sys.dm_exec_query_stats AS qs 
    CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
    CROSS APPLY sys.dm_exec_text_query_plan(qs.plan_handle, DEFAULT, DEFAULT) AS qp
    WHERE st.text LIKE N'SELECT City, StateProvinceID, PostalCode FROM Person.Address ORDER BY PostalCode DESC;%');

EXEC sp_create_plan_guide 
    @name = N'Guide1_from_XML_showplan', 
    @stmt = N'SELECT City, StateProvinceID, PostalCode FROM Person.Address ORDER BY PostalCode DESC;', 
    @type = N'SQL',
    @module_or_batch = NULL, 
    @params = NULL, 
    @hints =@xml_showplan;
GO

USE AdventureWorks2012;
GO
SELECT City, StateProvinceID, PostalCode FROM Person.Address ORDER BY PostalCode DESC;
GO
DECLARE @xml_showplan nvarchar(max);
SET @xml_showplan = (SELECT query_plan
    FROM sys.dm_exec_query_stats AS qs 
    CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
    CROSS APPLY sys.dm_exec_text_query_plan(qs.plan_handle, DEFAULT, DEFAULT) AS qp
    WHERE st.text LIKE N'SELECT City, StateProvinceID, PostalCode FROM Person.Address ORDER BY PostalCode DESC;%');

EXEC sp_create_plan_guide 
    @name = N'Guide1_from_XML_showplan', 
    @stmt = N'SELECT City, StateProvinceID, PostalCode FROM Person.Address ORDER BY PostalCode DESC;', 
    @type = N'SQL',
    @module_or_batch = NULL, 
    @params = NULL, 
    @hints =@xml_showplan;
GO

Ayrıca bkz.

Başvuru

sp_control_plan_guide uygulanır (Transact-sql)

sys.plan_guides (Transact-sql)

Veritabanı Altyapısı depolanan yordamlar (Transact-sql)

Sistem saklı yordamları (Transact-sql)

sys.dm_exec_sql_text (Transact-sql)

içinsys.dm_exec_cached_plansDinamik (Transact-sql)

sys.dm_exec_query_stats (Transact-sql)

sp_create_plan_guide_from_handle (Transact-sql)

sys.fn_validate_plan_guide (Transact-sql)

sp_get_query_template (Transact-sql)

Kavramlar

Plan kılavuzları