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.

PrzestrogaPrzestroga

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