sp_create_plan_guide_from_handle (Transact-SQL)

Bir sorgu planı plan önbelleğinde bir veya daha fazla plan kılavuzları oluşturur.sorgu iyileştiricisi , her zaman özel bir sorgu planı için belirtilen sorgu kullandığından emin olun, bu saklı yordam kullanabilirsiniz.Plan kılavuzları hakkında daha fazla bilgi için bkz: Plan kılavuzları anlama.

Konu bağlantısı simgesiTransact-SQL sözdizimi kuralları

Sözdizimi

sp_create_plan_guide_from_handle [ @name = ] N'plan_guide_name'
    , [ @plan_handle = ] plan_handle
    , [ [ @statement_start_offset = ] { statement_start_offset | NULL } ]

Bağımsız değişkenler

  • [ @ Name = ] n'plan_guide_name'
    plan kılavuzuadıdır.Plan Kılavuzu adları geçerli veritabanına belirlenmektedir.plan_guide_namekurallarýna uymak zorunda tanımlayıcıları ve sayı işareti (#) ile başlatılamıyor.En uzun plan_guide_name olan 124 karakter.

  • [ @ plan_handle = ] plan_handle
    toplu iş planı önbellekte tanımlar.plan_handleis varbinary(64).plan_handlearasında edindiğiniz sys.dm_exec_query_stats dinamik yönetim görünümü.

  • [ @ statement_start_offset = ] { statement_start_offset | null}]
    Belirtilen toplu iş içinde deyim başlangıç konumunu tanımlayan plan_handle.statement_start_offsetİş int, varsayılan değer null.

    deyim uzaklık karşılık statement_start_offsetsütun sys.dm_exec_query_statsdinamik yönetim görünümü.

    Ne zaman null belirtilirse veya deyim uzaklık belirtilmezse, plan kılavuzu her ' % s'cümlesi deyim sorgu planı için belirtilen planı tutamacını kullanarak toplu iş için oluşturulur.Elde edilen plan kılavuzları belirli bir plan kullanımını zorlamak için kullanmak plan sorgu ipucu kullanma kılavuzları planladığınız eşdeğerdir.

Açıklamalar

plan kılavuzu tüm deyim türleri için oluşturulamıyor.plan kılavuzu deyim toplu işoluşturulamazsa, saklı yordam deyim yoksayar ve toplu işsonraki deyim eder.Bir deyim birden çok kez aynı toplu işortaya çıkarsa, plan son oluşumu için etkinleştirilir ve önceki planları deyim için devre dışı bırakılır.Hiçbir deyimleri toplu iş plan kılavuzukullanılabilir, hata 10532 ortaya çıkar ve deyim başarısız olur.Her zaman planı tanıtıcıdan elde öneririz bu hata olasılığını önlemek içinsys.dm_exec_query_statsdinamik yönetim görünümü .

Güvenlik notuGüvenlik Notu

sp_create_plan_guide_from_handleplanı önbellekte göründükleri gibi planlarını temel alarak planı kılavuzları oluşturur.toplu iş metin, yani Transact-SQL ifadeler ve xml Showplan--(Query'ye geçilen herhangi bir hazır bilgi değeri dahil) karakter alınır içine plan kılavuzuelde edilen plan önbelleğinden.Bu metin dizelerinin ardından meta veriler veritabanı içinde depolanan önemli bilgileri içerebilir.Uygun izinlere sahip kullanıcılar kullanarak bu bilgileri görüntüleyebilir sys.plan_guides Katalog görünümü ve Plan Kılavuzu Properties iletişim kutusunda SQL Server Management Studio.Bir plan kılavuzuüzerinden hassas bilgiler ifşa değil emin olmak için gözden geçirme planı önbellekten oluşturulan planı kılavuzları öneririz.

Bir sorgu planı içinde birden çok deyimleri için plan kılavuzu oluşturma

Gibi sp_create_plan_guide, sp_create_plan_guide_from_handle kaldırır sorgu planını hedeflenen toplu iş veya modülünden planı önbellek.Bu, tüm kullanıcıların yeni plan kılavuzukullanarak başlamak emin olmak için yapılır.Tek sorgu planı içinde birden çok deyimleri plan kılavuzu oluştururken, bir belirtik işlemtüm planı kılavuzları oluşturarak kaldırılması planı önbellekten erteleyebilirsiniz.Bu yöntem , planın hareket tamamlanmış ve belirtilen her deyim plan kılavuzu oluşturulan kadar önbellekte kalmasını sağlar.b. örneğe bakın

İzinler

VIEW_SERVER_STATE izni gerektirir.Buna ek olarak, tek tek izin kullanarak oluşturduğunuz her plan kılavuzu gerekiyor: sp_create_plan_guide_from_handle.plan kılavuzu türü oluşturmak için nesne başvurulan nesnesi üzerinde alter izni gerektirir.plan kılavuzu türü oluşturmak için SQL veya şablonu geçerli veritabanı üzerinde alter izni gerektirir.Oluşturulacak plan kılavuzu türünü belirlemek için aşağıdaki sorguyu çalıştırın:

SELECT cp.plan_handle, sql_handle, st.text, objtype 
FROM sys.dm_exec_cached_plans AS cp
JOIN sys.dm_exec_query_stats AS qs ON cp.plan_handle = qs.plan_handle
CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS st;

İncelemek için oluşturduğunuz plan kılavuzu deyim içeren satýrýn objtype sonuç kümesisütun . Değeri Proc gösterir plan kılavuzu olan türü nesne.Gibi diğer değerler AdHoc veya Prepared plan kılavuzu türü SQLbulunduğunu.

Örnekler

A.Bir sorgu planı plan önbelleğinde plan kılavuzu oluşturma

Aşağıdaki örnek, bir sorgu planı plan önbelleğinden belirterek plan kılavuzu tek bir select deyim oluşturur.Örnek basit bir yürüterek başlar SELECT deyim plan kılavuzu oluşturulacaktır.Bu sorgu için plan kullanarak incelenir sys.dm_exec_sql_text ve sys.dm_exec_text_query_plan dinamik yönetimi görünümleri.plan kılavuzu için sorgu oluşturulur ve sorgu planı plan önbelleğinde sorgusu ile ilişkili belirterek.Örnekteki deyim son plan kılavuzu bulunduğunu doğrular.

USE AdventureWorks2008R2;
GO
SELECT WorkOrderID, p.Name, OrderQty, DueDate
FROM Production.WorkOrder AS w 
JOIN Production.Product AS p ON w.ProductID = p.ProductID
WHERE p.ProductSubcategoryID > 4
ORDER BY p.Name, DueDate;
GO
-- Inspect the query plan by using dynamic management views.
SELECT * FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(sql_handle)
CROSS APPLY sys.dm_exec_text_query_plan(qs.plan_handle, qs.statement_start_offset, qs.statement_end_offset) AS qp
WHERE text LIKE N'SELECT WorkOrderID, p.Name, OrderQty, DueDate%';
GO
-- Create a plan guide for the query by specifying the query plan in the plan cache.
DECLARE @plan_handle varbinary(64);
DECLARE @offset int;
SELECT @plan_handle = plan_handle, @offset = qs.statement_start_offset
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS st
CROSS APPLY sys.dm_exec_text_query_plan(qs.plan_handle, qs.statement_start_offset, qs.statement_end_offset) AS qp
WHERE text LIKE N'SELECT WorkOrderID, p.Name, OrderQty, DueDate%';

EXECUTE sp_create_plan_guide_from_handle 
    @name =  N'Guide1',
    @plan_handle = @plan_handle,
    @statement_start_offset = @offset;
GO
-- Verify that the plan guide is created.
SELECT * FROM sys.plan_guides
WHERE scope_batch LIKE N'SELECT WorkOrderID, p.Name, OrderQty, DueDate%';
GO

B.Çoklu deyimli bir toplu işiçin birden çok plan kılavuzu oluşturma

Aşağıdaki örnek, çoklu deyimli bir toplu işiçinde iki ifade plan kılavuzu oluşturur.Böylece ilk plan kılavuzu oluşturulduktan sonra toplu iş sorgu planını planı önbellekten kaldırılmaz planı kılavuzları bir ' % s'hareketi belirtik işlem içinde oluşturulur.Örneğin, çoklu deyimli toplu işyürüterek başlar.Dinamik yönetimi görünümleri kullanarak toplu iş planı incelenir.Her ' % s'deyimi deyim toplu iş için bir satırı döndürdüğünü dikkat edin.plan kılavuzu sonra birinci ve üçüncü deyimleri toplu iş belirterek oluşturulduğu @statement_start_offset parametresi.Örnekteki deyim son planı kılavuzları bulunduğunu doğrular.

USE AdventureWorks2008R2;
GO
SELECT * FROM Production.Product WHERE ProductSubcategoryID > 4;
SELECT * FROM Person.Address;
SELECT * FROM Production.Product WHERE ProductSubcategoryID > 10;
GO

-- Examine the query plans for this batch
SELECT * FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(sql_handle)
CROSS APPLY sys.dm_exec_text_query_plan(qs.plan_handle, qs.statement_start_offset, qs.statement_end_offset) AS qp
WHERE text LIKE N'SELECT * FROM Production.Product WHERE ProductSubcategoryID > 4%';
GO

-- Create plan guides for the first and third statements in the batch by specifying the statement offsets.
BEGIN TRANSACTION

DECLARE @plan_handle varbinary(64);
DECLARE @offset int;

SELECT @plan_handle = plan_handle, @offset = qs.statement_start_offset
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS st
CROSS APPLY sys.dm_exec_text_query_plan(qs.plan_handle, qs.statement_start_offset, qs.statement_end_offset) AS qp
WHERE text LIKE N'SELECT * FROM Production.Product WHERE ProductSubcategoryID > 4%'
AND SUBSTRING(st.text, (qs.statement_start_offset/2) + 1,
                        ((CASE statement_end_offset 
                              WHEN -1 THEN DATALENGTH(st.text)
                              ELSE qs.statement_end_offset END 
                              - qs.statement_start_offset)/2) + 1)  like 'SELECT * FROM Production.Product WHERE ProductSubcategoryID > 4%'

EXECUTE sp_create_plan_guide_from_handle 
    @name =  N'Guide_Statement1_only',
    @plan_handle = @plan_handle,
    @statement_start_offset = @offset;

SELECT @plan_handle = plan_handle, @offset = qs.statement_start_offset
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS st
CROSS APPLY sys.dm_exec_text_query_plan(qs.plan_handle, qs.statement_start_offset, qs.statement_end_offset) AS qp
WHERE text LIKE N'SELECT * FROM Production.Product WHERE ProductSubcategoryID > 4%'
AND SUBSTRING(st.text, (qs.statement_start_offset/2) + 1,
                        ((CASE statement_end_offset 
                              WHEN -1 THEN DATALENGTH(st.text)
                              ELSE qs.statement_end_offset END 
                              - qs.statement_start_offset)/2) + 1)  like 'SELECT * FROM Production.Product WHERE ProductSubcategoryID > 10%'

EXECUTE sp_create_plan_guide_from_handle 
    @name =  N'Guide_Statement3_only',
    @plan_handle = @plan_handle,
    @statement_start_offset = @offset;

COMMIT TRANSACTION
GO

-- Verify the plan guides are created.
SELECT * FROM sys.plan_guides;
GO