Udostępnij za pośrednictwem


Za pomocą planu użycia kwerendy wskazówkę dotyczącą na kwerendach z kursorów

PLAN użyć wskazówki dotyczącej kwerendy można używać w kwerendach, które określić żądania kursor.W poniższej tabela przedstawiono kursor kombinacji opcje przewijania, które są obsługiwane z pomocą PLAN dla interfejsu API serwera kursory, Transact-SQL kursory, które używają Transact-SQL Extended składni i Transact-SQL kursory, które używają składni ISO.

Opcja Scroll (@ scrollopt wartość dla interfejsu API serwera kursorów)

UŻYJ PLAN obsługiwane dla interfejsu API serwera kursory

UŻYJ PLAN obsługiwane dla języka Transact-SQL kursorami ze składnią języka Transact-SQL rozszerzony

UŻYJ PLAN obsługiwane kursorami języka Transact-SQL należy użyć składni ISO

STATYCZNE

Y

Y

Nie dotyczy

DYNAMICZNE

N

N

Nie dotyczy

ZESTAW KLUCZY

N

N

Nie dotyczy

FORWARD_ONLY

N

N

Nie dotyczy

FAST_FORWARD

Y

Y

Nie dotyczy

FORWARD_ONLY STATYCZNE

Nie dotyczy

Y

Nie dotyczy

WIELKOŚĆ LITER

Nie dotyczy

Nie dotyczy

Y

Kwerendy zawierające kursory mają z nimi związane, zamiast jeden plan związane z kwerendami przesyłany bez kursorów dwóch planów kwerend.Plany te mogą być typu OPEN, pobrania lub odświeżania, w zależności od typu kursor.

Jeden z dwóch planów kursor bezpośrednio jest generowany na podstawie kwerendy wprowadzania i innych plan jest generowany automatycznie.Plany te są nazywane odpowiednio planu wprowadzania kwerendę i wygenerowany plan.W poniższej tabela przedstawiono plany, które są generowane dla kursory FAST_FORWARD i STATYCZNE (INSENSITIVE).

Typ kursora

Otwórz kursor plan

Plan kursor pobierania

Odśwież plan kursor

FAST_FORWARD

Nie dotyczy

Kwerendy danych wejściowych

Wygenerowany

STATYCZNE

Kwerendy danych wejściowych

Wygenerowany

Nie dotyczy

Plany kwerend XML kwerendy kursor czasami pojawiają się jako pojedynczego dokumentu XML, który zawiera zarówno planów.Plany te są nazywane planów dwóch części.

Plany kursor czasami pojawiają się jako dwa oddzielne plany.Na przykład w SQL Server Profiler śledzenia dla STATYCZNYCH API lub Transact-SQL kursor planu kwerend, można zobaczyć, że dwóch różnych XML kwerendy skompilować dla Showplan zdarzenia są generowane.Tylko wejściowego (Otwórz) plan kwerend jest znacząca dla planu w tym przypadek wymuszania.Plan wprowadzania kwerend należy używać w wskazówka użyć planu.Tworzony jest także prosty wygenerowany plan (pobierania), ale go nie jest wymagane, lub dozwolone dla planu wymuszania.Uznają planu wprowadzania kwerend (Otwórz), ponieważ planu, który zbiera najpierw zestaw wierszy spełniających kwerendy kursor.

Ważna informacjaWażne:

Nie należy wymusić noncursor plan dla kwerendy kursor lub odwrotnie.Wymuszanie plan może się nie powieść, jeśli to zrobisz, nawet jeśli kursor kwerendy i noncursor kwerendy są takie same.

Następujących typów wyjść planu kwerendy XML, opisujących planów kursor można wymusić plan z planu użycia kursora określonych typów:

  • Dwóch części planu kursor

  • Plan kwerend wprowadzania jednej części kursor

Plan kursor zostanie wymuszone może być plan uzyskanej za pomocą dowolnego z następujących mechanizmów uzyskiwania planu kwerendy XML:

  • Oparte na języku XML SQL Server Profiler śledzenia zdarzeń.Zdarzenia te mogą obejmować showplan xml, XML kwerendy skompilować dla Showplan, i Profilu statystyki XML Showplan.

  • ZESTAW Z SHOWPLAN_XML

  • USTAW STATYSTYKI NA XML

  • Dynamiczne zarządzanie widoki i funkcje, takie jak następującej kwerendy:

    SELECT *
    FROM sys.dm_exec_query_stats 
    CROSS APPLY sys.dm_exec_query_plan(plan_handle)
    

Przestrzegając użycia kursora API serwera aplikacji

Biblioteka DB, ODBC, ADO i OLEDB aplikacje często oddziaływać na SQL Server za pomocą interfejsu API serwera kursory.You can see the calls that are submitted to API server cursor stored procedures by examining the SQL Server Profiler RPC:Starting events when an application that is built by using one of these interfaces is running.

Przykład: Narzucanie planu kwerendy z kursorem

Założono używasz aplikacji, która współpracuje z AdventureWorks2008R2 bazy danych za pomocą kursorów ODBC i chcesz wymusić plan dla kwerendy przesyłane do SQL Server za pomocą kursor serwera interfejsu API rutynowych.Aby wymusić przewodnik planu, zebrać plan dla kwerendy przesyłane za pośrednictwem kursor API rutynowych i następnie utworzenia przewodnik planu wymusić plan dla kwerendy.Mieć aplikacji ponownie uruchom kwerendę i bada plan zweryfikować został zmuszony.

Krok 1: Zebrać planu

Uruchom SQL Server Profiler śledzenia i wybierz showplan xml i RPC: uruchamianie zdarzenia.Mieć aplikacji wykonać kwerendy, dla którego chcesz wymusić planu.Kliknij RPC: uruchamianie zdarzenie, który jest generowany.Załóżmy, że RPC: uruchamianie zdarzenie ma następujące dane tekstowe:

DECLARE @p1 int
SET @p1=-1
DECLARE @p2 int
SET @p2=0
DECLARE @p5 int
SET @p5=8
DECLARE @p6 int
SET @p6=8193
DECLARE @p7 int
SET @p7=0
EXEC sp_cursorprepexec @p1 OUTPUT,@p2 OUTPUT,NULL,N'SELECT * FROM Sales.SalesOrderHeader h, Sales.SalesOrderDetail d WHERE h.SalesOrderID = d.SalesOrderID AND h.OrderDate BETWEEN ''20030101'' AND ''20040101''',@p5 OUTPUT,@p6 OUTPUT,@p7 OUTPUT
SELECT @p1, @p2, @p5, @p6, @p7

Zebrać planu kwerend przez kliknięcie prawym przyciskiem myszy showplan xml śledzenia zdarzeń zawierających planu wprowadzania kwerendy dla kwerendy, która pojawia się jako argumentsp_cursorprepexec instrukcja powyżej, a następnie wybierając Wyodrębnij dane zdarzenie.Zapisz dane zdarzenie (plan wykonania XML) do pliku CursorPlan.SQLPlan na pulpicie.Skopiuj plik CursorPlan.SQLPlan do CursorPlan.txt.W SQL Server Management Studio, otwórz CursorPlan.txt w oknie edytora.Aby zaoszczędzić czas później, użyj Znajdowanie i zamienianie do zastąpienia każdego pojedynczego cudzysłowu (') w planie z cztery znaki pojedynczego cudzysłowu ('''').Zapisz CursorPlan.txt.

Krok 2: Utworzyć plan, aby wymusić planu

Tworzenie przewodnik planu przez pisanie i wykonywanie następujących sp_create_plan_guide instrukcja wymusić przewodnik planu.Definicja ta przewodnik planu obejmuje plan XML przechwycone w poprzednim kroku w wskazówkę dotyczącą kwerendy przewodnik planu wykorzystania w przewodniku przewodnik planu.

Pisząc tej definicji przewodnika przewodnik planu, Wklej zawartość CursorPlan.txt do odpowiednich pozycji w @hints argumentu (tylko po OPTION(USE PLAN N'').

exec sp_create_plan_guide 
@name = N'CursorGuide1',
@stmt = N'SELECT * FROM Sales.SalesOrderHeader h, Sales.SalesOrderDetail d WHERE h.SalesOrderID = d.SalesOrderID AND h.OrderDate BETWEEN ''20030101'' AND ''20040101''',
@type = N'SQL',
@module_or_batch = NULL,
@params = NULL,
@hints = N'OPTION(USE PLAN N''<ShowPlanXML xmlns=''''https://schemas.microsoft.com/sqlserver/2004/07/showplan'''' Version=''''0.5'''' Build=''''9.00.1116''''><BatchSequence><Batch><Statements><StmtSimple>
   …
</StmtSimple></Statements></Batch></BatchSequence></ShowPlanXML>'')'

Krok 3: Wykonanie kwerendy i Zweryfikuj, że planu jest stosowane do niego

Aplikacja ponownie uruchomić kwerendę i zebrać jego plan wykonania XML za pomocą xml showplan zdarzenie w SQL Server Profiler.

Kliknij xml showplan zdarzenie dla planu.Powinien pojawić się plan jest podany w wymuszony w podręczniku przewodnik planu.

Kwerend parametrycznych kursora

If the API server cursor query that you want to create a plan guide for is parameterized, make sure you include both the statement string and the parameter definition string you see in the SQL Server Profiler RPC:Starting event in the plan guide definition.Ciąg definicji parametru jest również wymagane do uzyskania pomyślnych przewodnik planu odpowiada, podobnie jak z kwerend parametrycznych przedstawione za pomocą sp_executesql.