sp_create_plan_guide_from_handle (języka Transact-SQL)

Powoduje utworzenie jednej lub kilku prowadnic planu z planu kwerend w pamięci podręcznej planu.Aby upewnić się, że optymalizator kwerendy zawsze używa planu kwerend specyficzne dla określonej kwerendy można użyć tej procedura składowana .Aby uzyskać więcej informacji dotyczących planów, zobacz Opis planu prowadnic.

Ikona łącza do tematuJęzyka Transact-SQL składni konwencje

Składnia

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

Argumenty

  • [ @ Nazwa = ] N'plan_guide_name"
    Jest nazwą przewodnik planu.Plan przewodnik nazwy są o zakresie do bieżącej bazy danych.plan_guide_namemuszą być zgodne z zasadami identyfikatorów i nie może rozpoczynać się znakiem numeru (#).Maksymalna długość plan_guide_name 124 znaków.

  • [ @ plan_handle = ] plan_handle
    Identyfikuje partia w pamięci podręcznej planu.plan_handleis varbinary(64).plan_handlemożna otrzymać od sys.dm_exec_query_stats dynamiczny widok zarządzania.

  • [ @ statement_start_offset = ] { statement_start_offset | NULL}]
    Identyfikuje pozycję początkową instrukcja w partia określona plan_handle.statement_start_offsetjest int, domyślna wartość NULL.

    Przesunięcie instrukcja odpowiada statement_start_offset kolumna w sys.dm_exec_query_stats dynamiczny widok zarządzania.

    Gdy określona wartość NULL lub przesunięcie instrukcja nie jest określony, przewodnik planu jest tworzony dla każdej instrukcja w partia przy użyciu planu kwerend dla dojścia określony plan.Wynikowy plan guides są równoważne plan linie pomocnicze, które użyć wskazówki dotyczącej kwerendy za pomocą planu wymusić użycie określonego planu.

Uwagi

Nie można utworzyć przewodnik planu dla wszystkich typów instrukcja .Jeśli przewodnik planu nie można utworzyć dla instrukcja partia, procedura składowana ignoruje instrukcja i kontynuuje następnej instrukcja w partia.Jeśli instrukcja występuje wiele razy w tej samej partia, plan dla ostatniego wystąpienia jest włączona, i poprzednich planów dla instrukcja są wyłączone.Jeśli nie instrukcje w partia mogą być używane w przewodnik planu, spowodował błąd 10532 i instrukcja nie powiedzie się.Firma Microsoft zaleca, aby zawsze uzyskać dojście planu z sys.dm_exec_query_stats dynamiczny widok zarządzania do uniknięcia możliwości tego błędu.

Uwaga dotycząca zabezpieczeńUwaga dotycząca zabezpieczeń

sp_create_plan_guide_from_handleutworzenie prowadnic plan na podstawie planów pojawiają się w pamięci podręcznej planu.Oznacza to, że tekst partia Transact-SQL sprawozdań i XML Showplan są pobierane (w tym wartości literału, przekazać do kwerendy) znak po znaku z pamięci podręcznej planu do wynikowej przewodnik planu.Te ciągi tekstowe mogą zawierać poufne informacje, które są następnie przechowywane w metadane bazy danych.Użytkownicy z odpowiednimi uprawnieniami mogą przeglądać te informacje za pomocą sys.plan_guides katalogu widoku i Właściwości przewodnik planowania okno dialogowe w SQL Server Management Studio.W celu zapewnienia poufne informacje nie są ujawniane przez przewodnik planu, zaleca się recenzowania prowadnice plan utworzony z pamięci podręcznej planu.

Tworzenie prowadnic Plan dla wielu instrukcji w ramach planu kwerend

Podobnie jak sp_create_plan_guide, sp_create_plan_guide_from_handle usuwa plan kwerend dla docelowej partia lub modułu z pamięci podręcznej planu.Można to zrobić, aby zapewnić, że wszyscy użytkownicy rozpocząć korzystanie z nowych przewodnik planu.Podczas tworzenia przewodnik planu dla wielu instrukcji w ramach planu pojedynczą kwerendę, można odłożyć usunięcie planu z pamięci podręcznej przez utworzenie prowadnic planu w transakcja jawna.Ta metoda umożliwia plan pozostają w pamięci podręcznej, dopóki transakcja zakończyła się i tworzona jest przewodnik planu dla każdej określonej instrukcja .Zobacz przykład B.

Uprawnienia

Wymaga uprawnienia VIEW_SERVER_STATE.Ponadto indywidualne uprawnienia są wymagane dla każdego przewodnik planu jest tworzony przy użyciu sp_create_plan_guide_from_handle.Aby utworzyć przewodnik planu typu obiektu wymaga uprawnień ALTER obiektu, do którego istnieje odwołanie.Aby utworzyć przewodnik planu typu SQL lub szablonu wymaga uprawnień ALTER w bieżącej bazie danych.Aby określić typ przewodnik planu , który zostanie utworzony, uruchom następującą kwerendę:

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;

W wierszu, który zawiera instrukcja , dla którego tworzysz przewodnik planu, bada objtype zestaw wynikówkolumna . Wartość Proc wskazuje, że przewodnik planu jest typu obiektu.Inne wartości, takich jak AdHoc lub Prepared wskazuje typ SQLjest przewodnik planu .

Przykłady

A.Tworzenie przewodnik planu z planu kwerend w pamięci podręcznej plan

Poniższy przykład tworzy przewodnik planu pojedynczą instrukcja SELECT, określając planu kwerend z pamięci podręcznej planu.Przykład rozpoczyna się wykonując prosty SELECT instrukcja dla którego zostanie utworzony przewodnik planu .Plan dla tej kwerendy jest badany za pomocą sys.dm_exec_sql_text i sys.dm_exec_text_query_plan dynamiczne zarządzanie widokami.przewodnik planu zostanie utworzona w kwerendzie przez określenie planu kwerend w pamięci podręcznej planu, który jest skojarzony z kwerendą.Końcowe instrukcja w przykładzie sprawdza, czy istnieje przewodnik planu .

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.Tworzenie wielu plan guides wieloma instrukcjami partia

Poniższy przykład tworzy przewodnik planu dwie deklaracje w wieloma instrukcjami partia.Plan linie pomocnicze są tworzone w obrębie transakcja jawna tak, aby plan kwerend dla partia nie są usuwane z pamięci podręcznej planu po utworzeniu pierwszego przewodnik planu .Przykład rozpoczyna się od wykonywanych z wieloma instrukcjami partia.Plan dla partia jest badana przy użyciu widoków dynamicznego zarządzania.Należy zauważyć, że zwracany jest wiersz dla każdej instrukcja w partia .przewodnik planu jest tworzona przy pierwszym i trzecim sprawozdań w partia określając @statement_start_offset parametru.Ostateczne instrukcja w przykładzie sprawdza, czy istnieje plan guides.

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