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ż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.
Zobacz także