Wskazówki kwerendy (Transact-SQL)
Wskazówki kwerendy określić, że wskazane wskazówki powinny być używane w kwerendzie.Kwerendy wskazówki mają wpływ na wszystkie podmioty w instrukcja.Unia jest zaangażowany w głównej kwerendzie, tylko ostatniej kwerendy obejmujące UNIJNEJ operacji jest opcja klauzula.Wskazówki kwerendy są określone jako część opcji klauzula.Jeśli jeden lub więcej wskazówek kwerendy powodują optymalizator kwerendy nie w celu wygenerowania planu prawidłowego, powstaje błąd 8622.
Przestroga |
---|
Ponieważ SQL Server optymalizator kwerendy zazwyczaj wybiera najlepszego planu wykonania kwerendy, zaleca się tylko przy użyciu wskazówek w ostateczności dla doświadczonych programistów i bazy danych Administratorzy. |
Stosuje się do:
Składnia
<query_hint > ::=
{ { HASH | ORDER } GROUP
| { CONCAT | HASH | MERGE } UNION
| { LOOP | MERGE | HASH } JOIN
| FAST number_rows
| FORCE ORDER
| MAXDOP number_of_processors
| OPTIMIZE FOR ( @variable_name { UNKNOWN | = literal_constant } [ , ...n ] )
| OPTIMIZE FOR UNKNOWN
| PARAMETERIZATION { SIMPLE | FORCED }
| RECOMPILE
| ROBUST PLAN
| KEEP PLAN
| KEEPFIXED PLAN
| EXPAND VIEWS
| MAXRECURSION number
| USE PLAN N'xml_plan'
| TABLE HINT ( exposed_object_name [ , <table_hint> [ [, ]...n ] ] )
}
<table_hint> ::=
[ NOEXPAND ] {
INDEX ( index_value [ ,...n ] ) | INDEX = ( index_value )
| FASTFIRSTROW
| FORCESEEK
| HOLDLOCK
| NOLOCK
| NOWAIT
| PAGLOCK
| READCOMMITTED
| READCOMMITTEDLOCK
| READPAST
| READUNCOMMITTED
| REPEATABLEREAD
| ROWLOCK
| SERIALIZABLE
| TABLOCK
| TABLOCKX
| UPDLOCK
| XLOCK
}
Argumenty
{WARTOŚĆ MIESZANIA | GRUPA KOLEJNOŚCI}
Określa, że opisane w Grupuj według, DISTINCT lub obliczeń z klauzula kwerendy agregacji powinny używać mieszania lub kolejności.{ SCALANIE | MIESZANIE | UNIA CONCAT}
Określa, że wszystkie operacje Unii są wykonywane przez scalanie, mieszanie, lub ustawia konkatenację Unii.Jeżeli określono więcej niż jeden związek Wskazówka optymalizator kwerendy wybiera najtańszych strategii z tych wskazówek określone.{ PĘTLA | SCALANIE | MIESZANIE} SPRZĘŻENIA
Określa, że wszystkich operacji łączyć są wykonywane przez pętli sprzężenia, scalanie sprzężenia lub mieszania sprzężenia w kwerendzie całego.Jeżeli określono więcej niż jedno łączyć wskazówkę dotyczącą Optymalizator wybiera najtańszych strategii łączyć z tymi dozwolonych.Jeśli w tej samej kwerendzie określony jest również wskazówka łączyć w klauzula FROM dla określonych pary tabel, to wskazówka łączyć ma pierwszeństwo w łącząca dwie tabele, mimo że będzie nadal uznane wskazówki kwerendy.W związku z tym Wskazówka łączyć dla pary tabel tylko mogą ograniczyć wybór metody dozwolone łączyć w wskazówkę dotyczącą kwerendy.Aby uzyskać więcej informacji, zobacz Dołącz wskazówek (Transact-SQL).
SZYBKIEnumber_rows
Określa, że kwerenda jest zoptymalizowany pod kątem szybkiego pobierania pierwszej number_rows. jest to nieujemna liczba całkowita.Po pierwszym number_rows są zwracane kontynuuje wykonywanie kwerendy i wytwarza jego pełna zestaw wyników.FORCE ORDER
Określa, że kolejność łączyć wskazaną składni kwerendy jest zachowywany podczas optymalizacji kwerendy.Za pomocą FORCE ORDER nie wpływa na zachowanie odwrócenie możliwą rolę optymalizator kwerendy.Aby uzyskać więcej informacji, zobacz Opis mieszania przyłącza.Ostrzeżenie
W korespondencji seryjnej instrukcjatabela źródłojest dostępny przed miejsce docelowetabela jako domyślnej kolejności łączyć , chyba że KIEDY określone źródło nie DOPASOWANE klauzula . Określanie kolejności życie zachowuje to zachowanie domyślne.
Aby uzyskać informacje dotyczące sposobu SQL Server optymalizator kwerendy wymusza wskazówka FORCE ORDER, jeśli kwerenda zawiera widok, zobacz Rozdzielczość widoku.
MAXDOPnumber
Zastępuje maksymalny stopień równoległości prostych opcjikonfiguracja sp_configure i Resource Governor kwerendy wybór tej opcji. Wskazówki dotyczącej kwerendy MAXDOP może przekraczać wartości skonfigurowane z sp_configure.Jeśli MAXDOP nie przekracza wartości skonfigurowane z Resource Governor Aparat baz danych używa wartości MAXDOP Resource Governor opisane w ZMIEŃ GRUPĘ obciążenia (Transact-SQL).Wszystkie semantyczne reguł używanych z maksymalny stopień równoległości prostychopcjakonfiguracja są stosowane, gdy użyć wskazówki dotyczącej kwerendy MAXDOP. Aby uzyskać więcej informacji, zobacz maksymalny stopień równoległości prostych opcji.Przestroga Jeśli MAXDOP jest zestaw na zero, serwer wybiera maksymalny stopień równoległości prostych.
OPTIMIZE FOR ( @variable_name { UNKNOWN | = literal_constant } [ , ...n ] )
Powoduje, że optymalizator kwerendy do użytku określonej wartości zmiennej lokalnej, gdy kwerenda jest skompilowany i zoptymalizowany.Wartość jest używana tylko podczas optymalizacji kwerendy, a nie podczas wykonywania kwerendy.@variable_name
Jest nazwą zmiennej lokalnej użyty w kwerendzie, której wartość może być przypisany do użytku z wskazówkę dotyczącą optymalizacji dla kwerendy.UNKNOWN
Określa, że optymalizator kwerendy używać danych statystycznych zamiast wartości początkowej dla ustalenia wartości dla zmiennej lokalnej podczas optymalizacji kwerendy.literal_constant
Przypisywanie wartości literału stała się @variable_name do użytku z optymalizacji dla kwerendy wskazówkę.literal_constantjest używane tylko podczas optymalizacji kwerendy, a nie jako wartość @variable_name podczas wykonywania kwerendy.literal_constantmoże być dowolnym SQL Server system typ danych, który może być wyrażona jako literał stała.Typ danych literal_constant musi być niejawnie przekonwertować na dane wpisać @variable_name odwołania w kwerendzie.
Optymalizacja można przeciwdziałać domyślne zachowanie wykrywania parametr Optymalizator lub można używać podczas tworzenia planów.Aby uzyskać więcej informacji, zobacz Ponownej kompilacji procedury przechowywanej i Optymalizacja kwerend w wdrożonych aplikacji za pomocą prowadnic Plan.
OPTYMALIZACJA NIEZNANY
Powoduje, że optymalizator kwerendy używać podczas kompilacji i zoptymalizowane, łącznie z parametrów utworzone za pomocą wymuszone parametryzacji kwerendy dla wszystkich zmiennych lokalnych danych statystycznych zamiast wartości początkowe.Aby uzyskać więcej informacji na temat wymuszone parametryzacji zobacz Parametryzacja wymuszony.Jeśli OPTYMALIZUJ dla @ nazwa_zmiennej = literal_constant i optymalizacja dla NIEZNANYCH są używane w tym samym wskazówkę dotyczącą kwerendy, użyje optymalizator kwerendy literal_constant określonego dla określonej wartości i nieznany dla pozostałych wartości zmiennej.Wartości są używane tylko podczas optymalizacji kwerendy, a nie podczas wykonywania kwerendy.
PARAMETRYZACJA {PROSTE | WYMUSZONE}
Określa parametryzacji zasady, że SQL Server optymalizator kwerendy dotyczy kwerenda, gdy jest kompilowana.Ważne: Wskazówka dotycząca kwerendy PARAMETRYZACJA może być określony tylko wewnątrz przewodnik planu.Nie można określić bezpośrednio w kwerendzie.
PROSTE powoduje, że optymalizator kwerendy prób parametryzacji proste.WYMUSZONY powoduje, że optymalizator prób wymuszone parametryzacji.Wskazówka PARAMETRYZACJI kwerendy jest używana do zastąpić bieżące ustawienie bazy danych PARAMETRYZACJI zestawu opcji wewnątrz przewodnik planu.Aby uzyskać więcej informacji, zobacz Określanie zachowania parametryzacji kwerendy przy użyciu prowadnic Plan.
KOMPILUJ PONOWNIE
Powoduje, że Aparat baz danych programu SQL Server odrzucić plan wygenerowany dla kwerendy po jej wykonuje, wymuszanie optymalizator kwerendy do ponownego kompilowania kwerendy plan następnego czas tej samej kwerendy jest wykonywany.Bez określenia RECOMPILE, Aparat baz danych buforuje planów kwerend i wykorzystuje je ponownie.Gdy kompilowanie planów kwerend, wskazówki dotyczącej kwerendy RECOMPILE używa bieżących wartości wszelkich zmiennych lokalnych w kwerendzie i kwerendy znajduje się wewnątrz procedura składowana, bieżące wartości przekazane do żadnych parametrów.Ponownej kompilacji jest użyteczną alternatywą dla tworzenia używa klauzula WITH RECOMPILE tylko podzbiór kwerend wewnątrz procedura składowana, zamiast całej procedura składowananależy ponownie skompilowana procedura składowana .Aby uzyskać więcej informacji, zobacz Ponownej kompilacji procedury przechowywanej.Ponownej kompilacji jest również przydatny podczas tworzenia planu prowadnic.Aby uzyskać więcej informacji, zobacz Optymalizacja kwerend w wdrożonych aplikacji za pomocą prowadnic Plan.
NIEZAWODNY PLAN
Zmusza optymalizator kwerendy próby planu działania dla maksymalnej potencjalnej rozmiar wiersza, prawdopodobnie na koszt o wydajności.Podczas przetwarzania kwerendy tabele pośrednie i podmioty gospodarcze mogą mieć do przechowywania i przetwarzania wierszy, które są szersze, niż jeden wprowadzania wierszy.Wiersze mogą być tak szeroki, że czasami dany operator nie może przetworzyć wiersz.W takim przypadku Aparat baz danych generuje błąd podczas wykonywania kwerendy.Korzystając z planu NIEZAWODNE, poinstruuj optymalizator kwerendy nie, aby wziąć pod uwagę wszelkie planów kwerend, które napotkać ten problem.Jeżeli taki plan nie jest możliwe, optymalizator kwerendy zwraca błąd zamiast Odraczanie wykrywania błędów do wykonania kwerendy.Wiersze mogą zawierać kolumny o zmiennej długości; Aparat baz danych pozwala na określone wiersze, które mają maksymalny rozmiar potencjalnych poza zdolność Aparat baz danych do ich przetworzenia.Ogólnie rzecz biorąc, pomimo maksymalny rozmiar potencjalnych aplikacja przechowuje wiersze, które mają rzeczywistych rozmiarów w granicach, Aparat baz danych można procesu.Jeśli Aparat baz danych napotka wiersz, który jest zbyt długa, zwracany jest błąd wykonania.
KEEP PLAN
Zmusza optymalizator kwerendy złagodzenie recompile Szacowany próg dla kwerendy.Próg recompile szacowany jest punkt, w którym kwerendy jest ponownie automatycznie kompilowana podczas szacunkową liczbę kolumna indeksowanych zmiany zostały dokonane, uruchamiając UPDATE, DELETE, korespondencji seryjnej do tabela lub WSTAWIANIA sprawozdania.Określanie KEEP PLAN upewnia się, że kwerenda nie będzie zwrócenie jako, często w przypadku, gdy istnieje wiele aktualizacji tabela.KEEPFIXED PLAN
Zmusza optymalizator kwerendy do ponownego kompilowania kwerendy ze względu na zmiany w statystykach.Określanie KEEPFIXED PLAN pozwala upewnić się, że kwerenda będzie ponownie kompilowana tylko w przypadku zmiany schematu tabel podstawowych lub jeżeli sp_recompile jest wykonywane w tych tabelach.ROZWIJANIE WIDOKÓW
Określa, że widoki indeksowane są rozwinięte i optymalizator kwerendy nie rozważy żadnych indeksowany widok jako zamiennik dla jakiejkolwiek części kwerendy.Widok jest rozwinięty, gdy nazwa widoku zastępuje definicję widoku w tekst kwerendy.Ta wskazówka dotycząca kwerendy praktycznie uniemożliwia bezpośrednie użycie widoków indeksowanych i indeksów na widoki indeksowane w planu kwerend.
indeksowany widok nie jest rozwinięta, tylko wtedy, gdy widok odwołuje się bezpośrednio w części SELECT kwerendy i Z (NOEXPAND) lub Z (NOEXPAND INDEKSU ( index_value**,**...n)) jest określony.Aby uzyskać więcej informacji na temat wskazówkę dotyczącą kwerendy Z (NOEXPAND), zobacz z.
Wskazówka dotyczy tylko widoki zaznacz część instrukcji, łącznie z tymi w instrukcji INSERT, UPDATE, korespondencji seryjnej i DELETE.
MAXRECURSIONnumber
Określa maksymalną liczbę recursions dozwoloną dla tej kwerendy.numberto nieujemna liczba całkowita od 0 do 32767.Określono wartość 0, brak limitu jest stosowana.Jeśli ta opcja nie jest określony, domyślny limit dla serwera jest 100.Gdy określona lub osiągnięty zostanie domyślny numer MAXRECURSION limit podczas wykonywania kwerendy, kwerenda została zakończona i zwracany jest błąd.
Z powodu tego błędu wszystkie efekty instrukcja są przywracane.Jeśli instrukcja SELECT instrukcja, mogą być zwracane wyniki częściowe lub Brak wyniki .Wszelkie zwrócono częściowe wyniki mogą nie obejmować wszystkich wierszy na poziomach rekursji poza rekursji określonego maksymalnego poziom.
Aby uzyskać więcej informacji, zobacz Z common_table_expression (języka Transact-SQL).
WYKORZYSTANIE planu n**'xml_plan"**
Zmusza optymalizator kwerendy używać istniejącego planu kwerend dla kwerendy, która jest określona przez 'xml_plan".Aby uzyskać więcej informacji, zobacz Plany określające kwerendę z planu wymuszanie.PLANOWANE jest użycie nie można określić z instrukcji INSERT, UPDATE, korespondencji seryjnej lub DELETE.TABLE HINT (exposed_object_name, <table_hint>[ ,...n ] ] )
Stosuje się wskazówka określonej tabela do tabela lub widoku, który odpowiada exposed_object_name.Zaleca się wskazówka tabela jako wskazówka dotycząca kwerendy tylko w kontekście przewodnik planu.exposed_object_namemoże to być jeden z następujących dokumentów:
Gdy alias jest używany dla tabela lub widoku w z klauzula kwerendy, exposed_object_name jest alias.
Kiedy alias nie jest używany, exposed_object_name jest dokładny odpowiednik tabela lub widoku w klauzulaFROM.Na przykład, jeśli tabela lub widok jest wywoływany przy użyciu nazwy dwóch części exposed_object_name jest tej samej nazwy dwóch części.
Gdy exposed_object_name jest określona bez także określanie Wskazówka tabela , wszystkie indeksy, określonych w kwerendzie jako część tabela wskazówkę dla obiektu są pomijane i użycie indeksu jest określana przez optymalizator kwerendy.Ta technika umożliwia wyeliminowania efektu Wskazówka tabela , gdy pierwotna kwerenda nie można modyfikować.Zobacz przykład J.
<table_hint> :: = {[NOEXPAND] {INDEX ( index_value,...n ) | INDEX = (index_value ) | FASTFIRSTROW | FORCESEEK | HOLDLOCK | NOLOCK | NOWAIT | PAGLOCK | PARAMETR READCOMMITTED | READCOMMITTEDLOCK | READPAST | READUNCOMMITTED | REPEATABLEREAD | ROWLOCK | MOŻLIWY DO SERIALIZACJI | TABLOCK | TABLOCKX | UPDLOCK | XLOCK}
Jest wskazówka tabela do tabela lub widoku, który odpowiada exposed_object_name jako wskazówka dotycząca kwerendy.Aby uzyskać opis tych wskazówek, zobacz Wskazówki tabel (Transact-SQL).Wskazówki tabeli inne niż indeks i FORCESEEK są niedozwolone, jak kwerendy wskazówek, jeśli kwerenda nie ma jeszcze z klauzula Określanie Wskazówka tabela .Aby uzyskać więcej informacji zobacz Spostrzeżenia.
Uwagi
Wskazówki kwerendy nie można określić za pomocą instrukcja INSERT z wyjątkiem, gdy używany wewnątrz instrukcjaSELECT klauzula .
Wskazówki kwerendy można określić tylko w góry -poziom kwerendy nie w podkwerend.Gdy wskazówka tabela jest określony jako wskazówka dotycząca kwerendy, wskazówka można określić w kwerendziepoziom górnej - lub podzapytanie; Jednakże wartość określona dla exposed_object_name Wskazówka tabeli klauzula musi odpowiadać dokładnie Nazwa uwidoczniona w kwerendzie lub podzapytanie.
Określanie wskazówek tabeli jako wskazówki kwerendy
Zaleca się użycie INDEKSU lub FORCESEEK Wskazówka tabela jako wskazówka dotycząca kwerendy tylko w kontekście przewodnik planu.Plan prowadnice są przydatne nie można zmodyfikować pierwotną kwerendę, na przykład, ponieważ jest to aplikacja innej firmy.Wskazówka dotycząca kwerendy, określone w przewodnik planu jest dodawane do kwerendy przed kompilacji i zoptymalizowany.Ad-hoc kwerend za pomocą tabeli Wskazówka klauzula tylko wtedy, gdy badania sprawozdań przewodnik planu .Innych kwerend ad hoc zaleca się, aby określenia te wskazówki tylko jako wskazówki do tabela .
Po określeniu jako wskazówka dotycząca kwerendy wskazówki tabela INDEKSU i FORCESEEK są prawidłowe dla następujących obiektów:
Tabele
Widoki
Widoki indeksowane
Typowe wyrażenia tabela (wskazówka musi być określona w SELECT instrukcja , którego zestaw wyników wypełnienie tabelatypowewyrażenie.)
Dynamiczne zarządzanie widokami
Nazwany podkwerendy
Wskazówki INDEKSU i FORCESEEK w tabela może być określona jako wskazówki kwerendy dla kwerendy, która nie ma żadnych istniejących wskazówek tabela lub może służyć do zastąpienia istniejących wskazówek INDEKSU lub FORCESEEK w kwerendzie, odpowiednio.Wskazówki tabeli inne niż indeks i FORCESEEK są niedozwolone, jak kwerendy wskazówek, jeśli kwerenda nie ma jeszcze z klauzula Określanie Wskazówka tabela .W tym przypadekdopasowywania wskazówka również należy określić jako wskazówka dotycząca kwerendy przy użyciu tabeli wskazówki w opcji klauzula zachować semantyka kwerendy.Na przykład, jeśli kwerenda zawiera wskazówki tabela NOLOCK opcja klauzula w @ wskazówki parametr przewodnik planu musi również zawierać wskazówki NOLOCK.Zobacz przykład K.Po tabela hint, inne niż indeks lub FORCESEEK określona za pomocą tabeli wskazówki w opcji klauzula bez dopasowywania wskazówkę dotyczącą kwerendy i vice versa; Błąd 8702 jest wywoływane (co oznacza, że opcja klauzula może spowodować semantyka kwerendy, aby zmienić), a kwerenda nie powiedzie się.Aby uzyskać więcej informacji, zobacz Korzystanie z INDEKSU i wskazówek FORCESEEK kwerendy w Plan Guides.
Przykłady
A.Za pomocą sprzężenia korespondencji seryjnej
W następującym przykładzie określono, że JOIN operacji w kwerendzie jest wykonywana przez MERGE JOIN.
USE AdventureWorks2008R2;
GO
SELECT *
FROM Sales.Customer AS c
INNER JOIN Sales.vStoreWithAddresses AS sa
ON c.CustomerID = sa.BusinessEntityID
WHERE TerritoryID = 5
OPTION (MERGE JOIN);
GO
B.Za pomocą Optymalizacja
Poniższy przykład powoduje, że optymalizator kwerendy , aby użyć wartości 'Seattle' dla zmiennej lokalnej @city_name i danych statystycznych do ustalania wartości zmiennej lokalnej za pomocą @postal_code podczas optymalizacji kwerendy.
USE AdventureWorks2008R2;
GO
DECLARE @city_name nvarchar(30);
DECLARE @postal_code nvarchar(15);
SET @city_name = 'Ascheim';
SET @postal_code = 86171;
SELECT * FROM Person.Address
WHERE City = @city_name AND PostalCode = @postal_code
OPTION ( OPTIMIZE FOR (@city_name = 'Seattle', @postal_code UNKNOWN) );
GO
C.Przy użyciu MAXRECURSION
MAXRECURSION można zapobiec tabelawspólnej błędnie sformułowany cyklicznewyrażenie wejść w nieskończoną pętlę. W poniższym przykładzie celowo tworzy nieskończonej pętli i korzysta z MAXRECURSION wskazówkę, aby ograniczyć liczbę poziomów rekursji do dwóch.
USE AdventureWorks2008R2;
GO
--Creates an infinite loop
WITH cte (CustomerID, PersonID, StoreID) AS
(
SELECT CustomerID, PersonID, StoreID
FROM Sales.Customer
WHERE PersonID IS NOT NULL
UNION ALL
SELECT cte.CustomerID, cte.PersonID, cte.StoreID
FROM cte
JOIN Sales.Customer AS e
ON cte.PersonID = e.CustomerID
)
--Uses MAXRECURSION to limit the recursive levels to 2
SELECT CustomerID, PersonID, StoreID
FROM cte
OPTION (MAXRECURSION 2);
GO
Po poprawieniu błędów kodowania MAXRECURSION nie jest już wymagana.
D.Za pomocą korespondencji seryjnej Unii
W poniższym przykładzie użyto MERGE UNION wskazówkę dotyczącą kwerendy.
USE AdventureWorks2008R2;
GO
SELECT *
FROM HumanResources.Employee AS e1
UNION
SELECT *
FROM HumanResources.Employee AS e2
OPTION (MERGE UNION);
GO
E.Za pomocą grupy mieszania i szybki
W poniższym przykładzie użyto HASH GROUP i FAST wskazówki kwerendy.
USE AdventureWorks2008R2;
GO
SELECT ProductID, OrderQty, SUM(LineTotal) AS Total
FROM Sales.SalesOrderDetail
WHERE UnitPrice < $5.00
GROUP BY ProductID, OrderQty
ORDER BY ProductID, OrderQty
OPTION (HASH GROUP, FAST 10);
GO
F.Przy użyciu MAXDOP
W poniższym przykładzie użyto MAXDOP wskazówkę dotyczącą kwerendy.
USE AdventureWorks2008R2 ;
GO
SELECT ProductID, OrderQty, SUM(LineTotal) AS Total
FROM Sales.SalesOrderDetail
WHERE UnitPrice < $5.00
GROUP BY ProductID, OrderQty
ORDER BY ProductID, OrderQty
OPTION (MAXDOP 2);
GO
G.Przy użyciu INDEKSU
W następujących przykładach użyto wskazówka INDEKSU.Pierwszy przykład określa jeden indeks.Drugi przykład określa wiele indeksów odwołanie do pojedynczej tabela .W obu przykładach ponieważ wskazówka jest stosowana w tabela , która używa alias, wskazówka tabeli klauzula należy także określić takiego samego alias jako nazwa obiektu narażonych.
USE AdventureWorks2008R2;
GO
EXEC sp_create_plan_guide
@name = N'Guide1',
@stmt = N'SELECT c.LastName, c.FirstName, e.JobTitle
FROM HumanResources.Employee AS e
JOIN Person.Person AS c ON e.BusinessEntityID = c.BusinessEntityID
WHERE e.OrganizationLevel = 2;',
@type = N'SQL',
@module_or_batch = NULL,
@params = NULL,
@hints = N'OPTION (TABLE HINT(e, INDEX (IX_Employee_OrganizationLevel_OrganizationNode)))';
GO
EXEC sp_create_plan_guide
@name = N'Guide2',
@stmt = N'SELECT c.LastName, c.FirstName, e.JobTitle
FROM HumanResources.Employee AS e
JOIN Person.Person AS c ON e.BusinessEntityID = c.BusinessEntityID
WHERE e.OrganizationLevel = 2;',
@type = N'SQL',
@module_or_batch = NULL,
@params = NULL,
@hints = N'OPTION (TABLE HINT(e, INDEX(PK_Employee_BusinessEntityID, IX_Employee_OrganizationLevel_OrganizationNode)))';
GO
H.Przy użyciu FORCESEEK
W poniższym przykładzie użyto Wskazówka tabela FORCESEEK.Ponieważ zastosowano wskazówka INDEKSU na tabela , który używa nazwy dwóch części, wskazówka tabeli klauzula należy także określić tej samej nazwy dwóch części jako nazwa obiektu narażonych.
USE AdventureWorks2008R2;
GO
EXEC sp_create_plan_guide
@name = N'Guide3',
@stmt = N'SELECT c.LastName, c.FirstName, HumanResources.Employee.JobTitle
FROM HumanResources.Employee
JOIN Person.Person AS c ON HumanResources.Employee.BusinessEntityID = c.BusinessEntityID
WHERE HumanResources.Employee.OrganizationLevel = 3
ORDER BY c.LastName, c.FirstName;',
@type = N'SQL',
@module_or_batch = NULL,
@params = NULL,
@hints = N'OPTION (TABLE HINT( HumanResources.Employee, FORCESEEK))';
GO
I.Przy użyciu wielu wskazówek tabela
Poniższy przykład dotyczy wskazówka jednej tabela i wskazówki FORCESEEK do innego.
USE AdventureWorks2008R2;
GO
EXEC sp_create_plan_guide
@name = N'Guide4',
@stmt = N'SELECT c.LastName, c.FirstName, e.JobTitle
FROM HumanResources.Employee AS e
JOIN Person.Person AS c ON e.BusinessEntityID = c.BusinessEntityID
WHERE OrganizationLevel = 3;',
@type = N'SQL',
@module_or_batch = NULL,
@params = NULL,
@hints = N'OPTION (TABLE HINT ( e, INDEX( IX_Employee_OrganizationLevel_OrganizationNode ) )
, TABLE HINT ( c, FORCESEEK) )';
GO
J.Aby zastąpić istniejące Wskazówka tabela przy użyciu wskazówka tabeli
Poniższy przykład pokazuje, jak użyć wskazówka wskazówki tabeli bez określania wskazówkę, aby zastąpić zachowanie Wskazówka tabela INDEKSU określone w klauzula FROM kwerendy.
USE AdventureWorks2008R2;
GO
EXEC sp_create_plan_guide
@name = N'Guide5',
@stmt = N'SELECT c.LastName, c.FirstName, e.JobTitle
FROM HumanResources.Employee AS e WITH (INDEX (IX_Employee_OrganizationLevel_OrganizationNode))
JOIN Person.Person AS c ON e.BusinessEntityID = c.BusinessEntityID
WHERE OrganizationLevel = 3;',
@type = N'SQL',
@module_or_batch = NULL,
@params = NULL,
@hints = N'OPTION (TABLE HINT(e))';
GO
K.Określanie semantyka-wpływających na podpowiedzi do tabela
Poniższy przykład zawiera dwa wskazówki tabela w kwerendzie: NOLOCK, czyli semantycznego wpływu na, a indeks jest wpływ innych niż semantyczne na.Aby zachować semantyka kwerendy, wskazówka NOLOCK jest określona w opcji klauzula przewodnik planu.Oprócz wskazówka NOLOCK wskazówek INDEKSU i FORCESEEK są określone i zastępować wpływu innych niż semantyczne na wskazówka w kwerendzie podczas kompilacji i zoptymalizowany instrukcja .
USE AdventureWorks2008R2;
GO
EXEC sp_create_plan_guide
@name = N'Guide6',
@stmt = N'SELECT c.LastName, c.FirstName, e.JobTitle
FROM HumanResources.Employee AS e
JOIN Person.Person AS c ON e.BusinessEntityID = c.BusinessEntityID
WHERE OrganizationLevel = 3;',
@type = N'SQL',
@module_or_batch = NULL,
@params = NULL,
@hints = N'OPTION (TABLE HINT ( e, INDEX( IX_Employee_OrganizationLevel_OrganizationNode) , NOLOCK, FORCESEEK ))';
GO
Poniższy przykład przedstawia alternatywną metoda zachowywanie semantyka kwerendy i umożliwiając Optymalizator wybrać innego niż określony w tabela wskazówka Indeks indeks.Jest to realizowane przez określanie wskazówka NOLOCK w opcji klauzula (ponieważ jest semantycznego wpływu na) i określając kluczowe wskazówka tabeli tylko odwołania do tabela i nie wskazówka.
USE AdventureWorks2008R2;
GO
EXEC sp_create_plan_guide
@name = N'Guide7',
@stmt = N'SELECT c.LastName, c.FirstName, e.JobTitle
FROM HumanResources.Employee AS e
JOIN Person.Person AS c ON e.BusinessEntityID = c.BusinessEntityID
WHERE OrganizationLevel = 2;',
@type = N'SQL',
@module_or_batch = NULL,
@params = NULL,
@hints = N'OPTION (TABLE HINT ( e, NOLOCK))';
GO