Korzystanie z podpowiedzi tabeli FORCESEEK

FORCESEEK tabela wskazówki siły optymalizator kwerendy do używania tylko indeks poszukiwania operacji jako ścieżka dostępu do danych w tabela lub widoku w kwerendzie.Aby zastąpić domyślny plan wybranego przez optymalizator kwerendy, aby uniknąć problemów z wydajnością spowodowane planu kwerend nieefektywne, można użyć wskazówki tej tabela.Na przykład, jeśli plan zawiera operatory skanowanie tabela lub indeksu i odpowiednich tabel powodować dużej liczby odczytów podczas wykonywania kwerendy, jak zaobserwowanych w Statystyki we/wy wyjściowe, wymuszanie indeks wyszukiwania operacji może zapewnić lepszą wydajność kwerendy.Jest to szczególnie, gdy niedokładne Kardynalność lub szacunki kosztów powodują optymalizatora do operacji skanowania przy kompilacji plan preferować w pełni czas.

FORCESEEK dotyczy zarówno grupowany i indeks nieklastrowany operacji szukania.Mogą być określone dla dowolnej tabela lub widoku w klauzula FROM instrukcja SELECT i FROM <table_source> klauzula aktualizacji lub usunięcia instrukcja.

PrzestrogaPrzestroga

Ponieważ SQL Server optymalizator kwerendy zazwyczaj wybiera najlepszego planu wykonania kwerendy, zaleca się korzystanie z podpowiedzi tylko w ostateczności przez doświadczonych programistów i administratorów bazy danych.

Plany oceny kwerendy dla zastosowania FORCESEEK

Wskazówka FORCESEEK tabela może być przydatne planu kwerend używa operatora skanowanie tabela lub indeksu na tabela lub widoku, ale indeks wyszukiwania, operator może być bardziej efektywny.Należy rozważyć następujące kwerendy i późniejsze wykonanie planu.

USE AdventureWorks2008R2;
GO
SELECT *
FROM Sales.SalesOrderHeader AS h
INNER JOIN Sales.SalesOrderDetail AS d 
    ON h.SalesOrderID = d.SalesOrderID 
WHERE h.TotalDue > 100
AND (d.OrderQty > 5 OR d.LineTotal < 1000.00);
GO

Następujący plan wykonania pokazuje, że optymalizator kwerendy wybrany operator skanowanie indeks klastrowany dostępu do danych w obu tabelach.

Plan wykonania z operatorami skanowania indeksu klastrowanego

Można wymusić optymalizator kwerendy do wykonywania operacji wyszukiwania na Sales.SalesOrderDetail tabela, określając wskazówka FORCESEEK, jak pokazano w następującej kwerendy.

USE AdventureWorks2008R2;
GO
SELECT *
FROM Sales.SalesOrderHeader AS h
INNER JOIN Sales.SalesOrderDetail AS d WITH (FORCESEEK)
    ON h.SalesOrderID = d.SalesOrderID 
WHERE h.TotalDue > 100
AND (d.OrderQty > 5 OR d.LineTotal < 1000.00);
GO

Następujący plan wykonania pokazuje wyniki FORCESEEK wskazówkę dotyczącą kwerendy.Indeks klastrowany poszukiwania operacji jest używany do dostępu do danych w Sales.SalesOrderDetail tabela.

Plan wykonania z operatorami przeszukiwania indeksu klastrowanego

Indeks Unii i obsługa punktu przecięcia

Wskazówka FORCESEEK obsługuje sum i indeksu.Wskazówka sprawia, że optymalizator kwerendy bardziej prawdopodobne użyć tych technik.Aby uniknąć zwalniania kompilacji czas prostych kwerend indeks związków i przecięcia są zwykle tylko wybrane zgodnie z zasady tej uwzględniać konto Kardynalność i selektywność kolumny.Jednakże gdy określono wskazówka FORCESEEK takie zasady są pomijane i techniki te są zawsze traktowane.Na przykład rozważmy następującą kwerendę:

SELECT * FROM T WITH(FORCESEEK) WHERE T.a = 1 AND T.b = 2;

Jeśli istnieją osobne, nieklastrowany indeksów kolumn a i b w tabela T, plan przecięcia indeks może być wybrany.Oznacza to, że plan zawiera indeks nieklastrowany poszukiwania operacji na kolumna a oraz indeks nieklastrowany operacji na kolumna bi przecina indeks klucz zestawy wynikowe przed wykonaniem operacji wyszukiwania w tabela podstawowej.

W poniższym przykładzie wybierana jest plan Unii indeksu.Oznacza to, że plan zawiera operacji wyszukiwania kolumna a i operacji wyszukiwania kolumna bi ustawia klucz uzyskany indeks, przed wykonaniem operacji wyszukiwania do związków tabela bazowa.

SELECT * FROM T WITH(FORCESEEK) WHERE T.a = 1 OR T.b = 2;

FORCESEEK w użyciu kwerendy używające jak lub w

Reguły Optymalizator kwerend i oszacowania Słaba kardynalność może powodować również Optymalizator wykonać operację skanowania tabela lub indeksie zamiast indeksu wyszukiwania, gdy kwerenda używa w lub jak jako predykaty wyszukiwania.

Poniższy przykład ilustruje sposób wskazówka FORCESEEK można życie optymalizator kwerendy do wykonywania indeks wyszukiwania operacji zamiast tabela podczas skanowania jak lub w są używane jako predykaty wyszukiwania.Aby wyświetlić planów wykonanie kwerendy, kliknij Zawierają rzeczywiste Plan wykonania przycisku paska narzędzi, przed uruchomieniem w przykładzie.

USE tempdb;
GO
DROP TABLE t;
GO
CREATE TABLE t(i int UNIQUE, j int, vc varchar(100));
CREATE INDEX t_vc ON t(vc);
GO
DECLARE @p1 int, @p2 int, @p3 int, @p4 int, @p5 int;
SELECT * FROM t WHERE i IN (@p1, @p2, @p3, @p4, @p5);
GO
DECLARE @p1 int, @p2 int, @p3 int, @p4 int, @p5 int;
SELECT * FROM t WITH (FORCESEEK) WHERE i IN (@p1, @p2, @p3, @p4, @p5);
GO
SELECT * FROM t WHERE vc LIKE 'Test%';
GO
SELECT * FROM t WITH (FORCESEEK) WHERE vc LIKE 'Test%';
GO
DECLARE @vc varchar(100);
SELECT * FROM t WHERE vc LIKE @vc;
GO
DECLARE @vc varchar(100);
SELECT * FROM t WITH (FORCESEEK) where vc like @vc;
GO

W widokach przy użyciu FORCESEEK

FORCESEEK można określić, z lub bez wskazówką index.Gdy wskazówka tabela FORCESEEK stosuje się do widoku lub indeksowany widok, wskazówka FORCESEEK jest rekursywnie propagowane przez wszystkie tabele w rozszerzonej wersja widoku.Wskazówka indeksu określony, jest ignorowana.Jeśli tabel nie ma co najmniej jeden indeks, znaleźć żadnego planu i zwracany jest błąd 8622.

Używając wskazówki FORCESEEK i NOEXPAND razem na odniesienie do indeksowany widok, bez rozwijania go najpierw jest używany indeksowany widok.Wskazówka FORCESEEK jest stosowane bezpośrednio do indeksowany widok jest traktowany jak tabela.

Jeśli zastosujesz wskazówkę FORCESEEK odwołanie do tabela, odwołanie do tabela nie może uczestniczyć w indeksowany widok dopasowywania.Jednak inne części kwerendy, które są dotknięte wskazówka FORCESEEK mogą uczestniczyć w indeksowany widok dopasowywania.Jest to porównywalne do zachowania dopasowania z wskazówek INDEKSU indeksowany widok.

Najlepsze praktyki zagadnienia

Firma Microsoft zaleca następujące wskazówki:

  • Przed użyciem wskazówka tabela FORCESEEK, upewnij się, że statystyki dotyczące bazy danych są dokładne i aktualne.

    Up-do-data statystyk umożliwiają Optymalizator dokładnie oceny 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.

  • Ocena kwerendy dla elementów, które mogą powodować słabą Kardynalność lub szacunki kosztów i usunąć te elementy, jeśli to możliwe.Na przykład zamienić zmiennych lokalnych parametrów lub literały i Ogranicz używanie złożonych z wielu instrukcja oródwierszową funkcji i zmiennych tabela w kwerendzie.Aby uzyskać więcej informacji na temat innych elementów, aby wyszukać Zobacz Statystyki używane przez optymalizator kwerend w 2005 Microsoft SQL Server.

  • Nie należy niepotrzebnie używać wskazówki INDEX w połączeniu z FORCESEEK.Jeśli FORCESEEK samodzielnie daje wystarczające planu, również za pomocą wskazówka może nadmiernie ograniczyć wybór ma Optymalizator.Ponadto wskazówką INDEX spowoduje niepowodzenie kwerendy na zmiany fizyczne schematu tabela wyeliminowanie indeksu określone w wskazówka.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, plan nie można odnaleźć 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.