Korzystanie z INDEKSU i wskazówek FORCESEEK kwerendy w Plan Guides
Wskazówki do tabela indeks i FORCESEEK można określić jako wskazówki kwerendy.Gdy określony jako wskazówki kwerendy, te wskazówki zachowują się w taki sam sposób jak wbudowany wskazówka tabela lub widoku.
Wskazówka zmusza optymalizator kwerendy do używania określonego indeksy dostępu do danych w tabela lub widoku w kwerendzie.Wskazówka FORCESEEK zmusza optymalizator używać tylko do indeksu wyszukiwania operacji dostępu do danych w tabela lub widoku.Te wskazówki służą w klauzula opcja przewodnik planu do wpływ optymalizacji kwerendy.Kwerendy odpowiada przewodnik planu, klauzula opcji określonych w podręczniku plan zostanie dodany do kwerendy, przed kompiluje i optymalizuje.Aby uzyskać więcej informacji na temat planów, zobacz Opis planu prowadnic.
Przestroga |
---|
Plan guides, które niewłaściwym użyciem wskazówki kwerendy może powodować problemy z kompilacji, wykonanie lub wydajności.Plan guides powinna być używana tylko przez doświadczonych programistów i administratorów baz danych. |
Po określeniu jako wskazówka dotycząca kwerendy wskazówki tabela indeks i FORCESEEK są prawidłowe dla następujących obiektów:
tabele
Widoki
Widoki indeksowane
Typowe wyrażenie tabela (wskazówka musi być określona w polu Wybierz instrukcja zestaw wyników, którego wypełnia typowe wyrażenie tabela.)
Dynamiczne zarządzanie widokami
Nazwany podkwerendy
Wskazówki do tabeli nie można określić dla funkcji oródwierszową, zmienne Tabela lub OPENROWSET instrukcji.
Aby określić wskazówką index dla indeksowany widok, wskazówka NOEXPAND musi także określona w opcji klauzula, inaczej wskazówka jest ignorowana.Aby uzyskać więcej informacji, zobacz Rozwiązywanie indeksów dla widoków.
Informacje na temat składni używane do określania wskazówek INDEKSU i FORCESEEK jako wskazówki kwerendy, zobacz Wskazówki kwerendy (Transact-SQL).
Najważniejsze wskazówki
Firma Microsoft zaleca następujące wskazówki:
Użyć wskazówki INDEX i FORCESEEK jako wskazówki kwerendy tylko w kontekście planu lub kwerend ad hoc podczas testowania instrukcji przewodnik planu.W przypadku innych kwerend ad hoc określić te wskazówki tabela wskazówki.
Przed użyciem wskazówka FORCESEEK, upewnij się, że statystyki dotyczące bazy danych są dokładne i aktualne.
Up-do-data Statystyka umożliwiają Optymalizator dokładnie ocenić kosztu kwerendy różnych planów i wybrać plan wysokiej jakości.Dlatego zaleca się ustawienie AUTO_CREATE_STATISTICS i AUTO_UPDATE_STATISTICS do na (domyślnie) dla każdej baza danych użytkownika.Można również ręcznie można zaktualizować statystyki dotyczące tabela lub widoku za pomocą aktualizacja statystyki instrukcja.
Nie należy niepotrzebnie używać wskazówki INDEX w połączeniu z FORCESEEK.Oznacza to, że jeśli FORCESEEK samodzielnie produkuje odpowiedni plan, również za pomocą wskazówka INDEKSU może nadmiernie ograniczyć Optymalizator wybór.Ponadto wskazówką INDEX spowoduje niepowodzenie zmiany fizyczne schematu tabela wyeliminowanie indeksu określone w wskazówka kwerendy.Natomiast tak długo, jak istnieje co najmniej jeden indeks można używać na tabela zastosowano wskazówka FORCESEEK, kwerenda będzie kompilować nawet w przypadku zmiany struktur z indeksu.
Nie należy używać z wskazówka FORCESEEK wskazówka INDEKSU (0).Indeks (0) wymusza skanowanie tabela bazowa.Gdy używana z FORCESEEK, znaleźć żadnego planu i zwracany jest błąd 8622.
Nie należy używać wskazówki dotyczącej kwerendy za pomocą planu z wskazówki FORCESEEK.Jeśli jednak wskazówka FORCESEEK jest ignorowana.
Indeks i wskazówek FORCESEEK przy użyciu innych wskazówek tabeli
Wskazówki INDEX i FORCESEEK mogą być określone dla kwerendy, która nie ma żadnych istniejących wskazówek tabela lub może służyć do zastąpienia jednego lub kilku istniejących INDEKSU lub FORCESEEK wskazówki w kwerendzie.Jeśli kwerenda, dostosowanego do przewodnik planu już ma klauzula WITH Określanie tabela tych wskazówek, wskazówki określone w @ wskazówki parametr przewodnik planu zastępują w kwerendzie.Na przykład, jeśli kwerenda zawiera wskazówki tabela WITH INDEX (PK_Employee_BusinessEntityID) dla HumanResources.Employee tabela i @ wskazówki określa parametr przewodnik planu OPTION (TABLE HINT ( HumanResources.Employee, INDEX( AK_Employee_LoginID ) ), użyje optymalizator kwerendy K_Employee_LoginID indeks.
Tabela wskazówek, inne niż indeks i FORCESEEK są niedopuszczalne jako wskazówki kwerendy w przewodnik planu Jeśli kwerenda nie ma jeszcze klauzula WITH Określanie wskazówka tabeli.przypadek dopasowywania wskazówka również należy określić jako wskazówka dotycząca kwerendy za pomocą wskazówka tabeli w klauzula opcji Zachowaj semantyka kwerendy.Na przykład, jeśli kwerenda zawiera wskazówki tabela NOLOCK @ wskazówki parametr przewodnik planu musi również zawierać wskazówki NOLOCK oprócz wszelkie wskazówki tabela indeks lub FORCESEEK w klauzula opcji.Zobacz przykład c w dalszej części tego tematu.Gdy wskazówka tabela inne niż indeks lub FORCESEEK jest określona przy użyciu tabela wskazówki w klauzula OPCJĘ bez dopasowywania wskazówkę dotyczącą kwerendy lub odwrotnie, błąd 8702 jest wywoływane, wskazująca, że klauzula opcji może spowodować semantyka kwerendy, aby zmienić, a kwerenda nie powiedzie się.
Indeks i wskazówek FORCESEEK przy użyciu innych wskazówek kwerendy
Jeśli kwerenda, dostosowanego do przewodnik planu już ma OPCJĘ klauzula kwerendy wskazówki określające wskazówki kwerendy określonej w @ wskazówki parametr przewodnik planu zastępują w kwerendzie.Jednak Podręcznik przewodnik planu do kwerendy zawierającej klauzulę opcji, należy dołączyć OPCJĘ klauzula kwerendy po określeniu tekst kwerendy zgodny w sp_create_plan_guide (języka Transact-SQL) instrukcja.Żądane podpowiedzi, określone w podręczniku plan ma zostać dodany do wskazówek, które już istnieją na tej kwerendzie zamiast zastępować je w klauzula opcja przewodnik planu należy określić oryginalnego wskazówki oraz dodatkowe wskazówki.
Przykłady
A.Przy użyciu FORCESEEK
W poniższym przykładzie użyto wskazówka FORCESEEK w @hints parametr przewodnik planu.Ta opcja zmusza optymalizator używać indeksu wyszukiwania operacji dostępu do danych w HumanResources.Employee tabela.Uwaga może to powodować Optymalizator używać indeksu, inne niż określone w tabela wskazówki.
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
B.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
C.Określanie wskazówek wpływających semantyka
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ślony w klauzula opcje przewodnik planu.Oprócz wskazówka NOLOCK wskazówek INDEKSU i FORCESEEK są określone i zastąpić wskazówka INDEKSU wpływu innych niż semantyczne na kwerendy po instrukcja jest skompilowany i zoptymalizowany.
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 dla zachowania semantyka kwerendy i umożliwiając Optymalizator wybór indeksu, inne niż określone w tabela Wskazówka indeksu.Jest to realizowane przez określanie wskazówek NOLOCK w klauzula opcje (ponieważ jest semantycznego wpływu na) i określając kluczowe wskazówka tabela tylko z parametrem odwołanie 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
D.Aby zastąpić istniejące wskazówka tabela przy użyciu wskazówka tabela
Poniższy przykład pokazuje jak użyć wskazówki tabela bez określania wskazówką INDEX, aby zastąpić zachowanie wskazówka tabela określonego w klauzula FROM kwerendy.Ta metoda umożliwia Optymalizator wybór indeksu, inne niż określone w tabela Wskazówka indeksu.
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