Wskazówki tabel (Transact-SQL)
Wskazówki do tabeli zastąpić domyślne zachowanie optymalizator kwerendy na czas trwania instrukcja język edycji danych (DML), określając blokowania metoda, jednego lub kilku indeksów, operacji, takich jak skanowanie tabela przeszukiwania indeksu lub inne opcje przetwarzania kwerendy.
Przestroga |
---|
Ponieważ SQL Server optymalizator kwerendy zazwyczaj wybiera najlepszego planu wykonania kwerendy, firma Microsoft zaleca wskazówki był używany tylko w ostateczności przez doświadczonych programistów i administratorów baz danych. |
Stosuje się do:
Składnia
WITH ( <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
}
<table_hint_limited> ::=
{
KEEPIDENTITY
| KEEPDEFAULTS
| FASTFIRSTROW
| HOLDLOCK
| IGNORE_CONSTRAINTS
| IGNORE_TRIGGERS
| NOWAIT
| PAGLOCK
| READCOMMITTED
| READCOMMITTEDLOCK
| READPAST
| REPEATABLEREAD
| ROWLOCK
| SERIALIZABLE
| TABLOCK
| TABLOCKX
| UPDLOCK
| XLOCK
}
Argumenty
WITH ( <table_hint> )[ ,...n
Z kilkoma wyjątkami tabela wskazówki są obsługiwane w klauzula FROM, tylko wtedy, gdy wskazówki są określane przy użyciu słowa kluczowego Z.Wskazówki do tabeli musi również określone w nawiasach.Ważne: Słowo kluczowe z pominięciem jest zdeprecjonowanej funkcji: Ta funkcja zostanie usunięta z przyszłej wersji programu Microsoft SQL Server. Należy unikać stosowania tej funkcji w nowych projektach oraz zaplanować modyfikację aplikacji, w których obecnie jest używana ta funkcja.
Dozwolone są następujące wskazówki tabela , z i bez słowa kluczowego Z: NOLOCK, READUNCOMMITTED, UPDLOCK, REPEATABLEREAD, SERIALIZABLE, parametr READCOMMITTED, FASTFIRSTROW, TABLOCK, TABLOCKX, PAGLOCK, ROWLOCK, NOWAIT, READPAST, XLOCK i NOEXPAND.Po określeniu te wskazówki tabela bez słowa kluczowego z wskazówek należy określić samodzielnie.Na przykład:
FROM t (TABLOCK)
Po określeniu wskazówka inną wskazówka musi być określona przy użyciu słowa kluczowego Z:
FROM t WITH (TABLOCK, INDEX(myindex))
Zaleca się, aby za pomocą przecinków między wskazówki do tabela .
Ważne: Oddzielanie wskazówki spacji zamiast przecinków jest zdeprecjonowanej funkcji: Ta funkcja zostanie usunięta z przyszłej wersji programu Microsoft SQL Server. Nie należy stosować tej funkcji w nowych projektach oraz jak najszybciej należy zmodyfikować aplikacje, w których obecnie jest używana ta funkcja.
Ograniczenia stosuje się gdy wskazówki są używane w kwerendach bazach danych o zgodności poziom 90 i wyższych.
NOEXPAND
Określa, że wszystkie widoki indeksowane nie są rozwinięte dostępu do odpowiednich tabel, gdy optymalizator kwerendy przetwarzania kwerendy.optymalizator kwerendy traktuje widok jak tabela o indeks klastrowany.NOEXPAND dotyczy tylko widoki indeksowane.Aby uzyskać więcej informacji zobacz Spostrzeżenia.INDEX ( index_value [ ,... n ] ) | INDEX = (index_value)
Składnia indeks() określa nazwy lub identyfikatory jednego lub kilku indeksów mają być używane przez optymalizator kwerendy podczas przetwarzania instrukcja.Alternatywne indeks = składnia określa wartość jeden indeks.Wskazówka tylko jeden indeks dla tabela można określić.Jeśli istnieje indeks klastrowany INDEX(0) wymusza skanowanie indeks klastrowany i INDEX(1) sił indeks klastrowany skanowania lub wyszukiwania.Jeśli istnieje nie indeks klastrowany INDEX(0) wymusza skanowanie tabela i INDEX(1) jest interpretowana jako błąd.
Użycie wielu indeksów na liście pojedynczą wskazówka duplikaty są ignorowane, a pozostałe indeksy wymienione na liście są używane do pobierania wierszy tabela.Kolejność indeksów w wskazówka jest znaczny.Kilka wskazówek indeksu wymusza także indeksu ANDing i optymalizator kwerendy zastosowanie tyle warunków, jak to możliwe na każdy indeks dostęp.Jeśli nie zawierają wszystkich kolumn, które odwołują się kwerendę kolekcja indeksów hinted, pobierania odbywa się pobrać pozostałe kolumny po Aparat baz danych programu SQL Server pobiera wszystkie kolumny indeksowanej.
Ostrzeżenie
Gdy wskazówka odnoszące się do wielu indeksów wtabela faktgwiazdy łączyćOptymalizator ignoruje Wskazówka indeksu i zwraca komunikat ostrzegawczy. Ponadto indeksu ORing nie jest dozwolone dla tabela ze wskazówką index określone.
Maksymalna liczba indeksów w tabela wskazówka wynosi 250 zbudowania indeksów nie klastrowanych.
KEEPIDENTITY
Ma zastosowanie tylko w INSERT instrukcja , gdy opcja luzem OPENROWSET.Określa, że tożsamość wartość lub wartości w pliku importowane dane są używane do identyfikacji kolumna.Jeśli KEEPIDENTITY nie jest określony, wartości tożsamości dla tej kolumna są weryfikowane, ale nie są importowane i optymalizator kwerendy automatycznie przypisuje wartości unikatowe na podstawie wartości początkowej i wartości przyrostu określone podczas tworzenia tabela .
Ważne: Jeśli plik danych nie zawiera wartości dla identyfikacji kolumna w tabela lub widoku, a kolumna tożsamości nie jest ostatnia kolumna w tabela, należy pominąć kolumnatożsamości.Aby uzyskać więcej informacji, zobacz Pomiń pole danych przy użyciu formatu pliku.kolumna tożsamooci pomyślnie zostało pominięte, optymalizator kwerendy automatycznie przypisuje unikatowe wartości kolumna tożsamości na wiersze zaimportowanej tabela .
Na przykład, która używa tego wskazówki w instrukcji INSERT...WYBIERZ * Z OPENROWSET(BULK...) instrukcja, zobacz Przechowywanie wartości tożsamości podczas zbiorczego, importowanie danych.
Aby uzyskać informacje dotyczące sprawdzania tożsamości wartość dla tabela, zobacz DBCC CHECKIDENT (Transact-SQL).
KEEPDEFAULTS
Ma zastosowanie tylko w INSERT instrukcja , gdy opcja luzem OPENROWSET.Określa wstawiania tabela kolumnawartość domyślna, ewentualne zamiast wartości NULL, gdy rekord danych brakuje wartości w kolumna.
Na przykład, która używa tego wskazówki w instrukcji INSERT...WYBIERZ * Z OPENROWSET(BULK...) instrukcja, zobacz Przechowywanie wartości null lub przy użyciu wartości domyślnych podczas importu zbiorczego.
FASTFIRSTROW
Odpowiada opcji (FAST 1).Aby uzyskać więcej informacji, zobacz Wskazówki kwerendy (Transact-SQL).Ważne: Ta funkcja zostanie usunięta z następnej wersji programu Microsoft SQL Server. Nie należy stosować tej funkcji w nowych projektach oraz jak najszybciej należy zmodyfikować aplikacje, w których obecnie jest używana ta funkcja.
FORCESEEK
Określa, że optymalizator kwerendy używać tylko do indeksu wyszukiwania operacji jako dostępu ścieżka do danych w tabela lub widoku, do którego odwołuje się w kwerendzie.FORCESEEK dotyczy zarówno grupowany i indeks nieklastrowany operacji szukania.Można określić dla dowolnej tabela lub widoku w klauzula FROM instrukcja SELECT i FROM <table_source> klauzula aktualizacji korespondencji seryjnej lub usuń instrukcja.
FORCESEEK można określić, z lub bez wskazówką INDEX.W połączeniu ze wskazówką index optymalizator kwerendy uważa się tylko poszukiwanie ścieżki dostępu do określonego indeksu.Jeśli FORCESEEK powoduje, że plan nie można odnaleźć, zwracany jest błąd 8622.Aby uzyskać więcej informacji, zobacz Korzystanie z podpowiedzi tabeli FORCESEEK.
HOLDLOCK
Odpowiada to SERIALIZABLE.Aby uzyskać więcej informacji zobacz temat SERIALIZABLE w dalszej części tego tematu.HOLDLOCK dotyczy tylko tabela lub widok, dla którego określono i tylko na czas trwania transakcji, określone przez instrukcja , używany w.HOLDLOCK nie można używać w SELECT instrukcja , która zawiera opcję PRZEGLĄDAJ, aby.IGNORE_CONSTRAINTS
Ma zastosowanie tylko w INSERT instrukcja , gdy opcja luzem OPENROWSET.Określa, że wszelkie ograniczenia w tabela są ignorowane przez operację importu zbiorczego.Domyślnie, WSTAW kontroli Sprawdź i Klucz OBCY ograniczenia.Po IGNORE_CONSTRAINTS jest określone dla operacji importu zbiorczego, WSTAW należy zignorować te ograniczenia dla miejsce docelowe tabela.Należy zauważyć, że nie można wyłączyć unikatowy, klucz podstawowy lub nie ograniczenia wartości NULL.
Można wyłączyć ograniczenia klucza OBCEGO i wyboru, jeśli dane wejściowe zawiera wiersze, które naruszają ograniczenia.Wyłączając ograniczenia wyboru i klucz OBCY można importować dane, a następnie użyć Transact-SQL instrukcji Oczyszczanie danych.
Jednakże gdy ograniczenia klucza OBCEGO i wyboru są ignorowane, każde zignorowane ograniczenia dla tabela jest oznaczony jako is_not_trusted w sys.check_constraints lub sys.foreign_keys katalogu widoku po operacji.W pewnym momencie należy sprawdzić ograniczeń dla całej tabela.Jeśli tabela nie jest pusty przed wykonaniem operacji import zbiorczy , revalidating ograniczenie kosztów może przekroczyć kosztów stosowania ograniczeń klucza OBCEGO i wyboru do pierwotnych danych.
IGNORE_TRIGGERS
Ma zastosowanie tylko w INSERT instrukcja , gdy opcja luzem OPENROWSET.Określa, że wszystkie wyzwalacze zdefiniowane w tabela są ignorowane przez operację importu zbiorczego.Domyślnie WSTAW dotyczy wyzwalaczy.
Ważne jest wykorzystanie IGNORE_TRIGGERS tylko wtedy, gdy aplikacja nie zależą od wszystkie wyzwalacze i DSI oznacza optymalne wykorzystanie wydajności.
NOLOCK
Odpowiada to READUNCOMMITTED.Aby uzyskać więcej informacji zobacz READUNCOMMITTED w dalszej części tego tematu.Ostrzeżenie
Dla instrukcji aktualizacji lub usunięcia: Ta funkcja zostanie usunięta z przyszłej wersji programu Microsoft SQL Server. Należy unikać stosowania tej funkcji w nowych projektach oraz zaplanować modyfikację aplikacji, w których obecnie jest używana ta funkcja.
NOWAIT
Powoduje, że Aparat baz danych zwrócić komunikat jak najszybciej blokada napotka na tabela.NOWAIT jest równoznaczne z wpisaniem USTAWIĆ LOCK_TIMEOUT 0 dla określonej tabela.PAGLOCK
Trwa blokad strona albo, w przypadku poszczególnych blokad podejmowane są zwykle w wierszach lub klawiszy lub gdy pojedynczej tabela blokada jest zazwyczaj podjąć.Domyślnie używa trybu blokada odpowiednia dla tej operacji.Po określeniu w transakcjach działające na MIGAWCE poziom izolacjiblokady strona nie zostaną podjęte chyba, że PAGLOCK w połączeniu z innymi wskazówki tabela wymagających blokady, takich jak UPDLOCK i HOLDLOCK.PARAMETR READCOMMITTED
Określa odczytu tego działania zgodne z zasadami dla odczytu POPEŁNIONYCH poziom izolacji przy użyciu albo blokowania lub wiersz, przechowywanie wersji.Jeśli opcja bazy danych READ_COMMITTED_SNAPSHOT jest wyłączona, Aparat baz danych nabywa blokady współużytkowane, jak dane jest odczytywana i zwalnia te blokady, po zakończeniu operacji odczytu.Jeśli opcja bazy danych READ_COMMITTED_SNAPSHOT jest włączone, Aparat baz danych nie nabywa blokady i używa wersji wiersza.Aby uzyskać więcej informacji na temat poziomów izolacji, zobacz Ustaw poziom izolacji transakcji (Transact-SQL).Ostrzeżenie
Dla instrukcji aktualizacji lub usunięcia: Ta funkcja zostanie usunięta z przyszłej wersji programu Microsoft SQL Server. Należy unikać stosowania tej funkcji w nowych projektach oraz zaplanować modyfikację aplikacji, w których obecnie jest używana ta funkcja.
READCOMMITTEDLOCK
Określa, który odczytać operacji przestrzegają zasad dla odczytu POPEŁNIONYCH poziom izolacji przy użyciu blokowania.Aparat baz danych Nabywa blokady współużytkowane, jak dane jest odczytywana i zwalnia te blokady, po zakończeniu operacji odczytu niezależnie od ustawień opcji bazy danych READ_COMMITTED_SNAPSHOT.Aby uzyskać więcej informacji na temat poziomów izolacji, zobacz Ustaw poziom izolacji transakcji (Transact-SQL).READPAST
Określa, że Aparat baz danych odczytuje wiersze, które są zablokowane przez inne transakcje.W większości przypadków to samo dotyczy stron.Po określeniu READPAST wierszapoziom i strona-poziom blokady są pomijane.Oznacza to, że Aparat baz danych pomija wiersze lub strony zamiast blokowania bieżącej transakcji, dopóki nie są zwalniane blokad w przeszłości.Załóżmy na przykład, tabela T1 zawiera całkowitą pojedynczej kolumna wartości 1, 2, 3, 4, 5.Jeśli transakcja a zmienia wartość 3, 8, ale nie jeszcze dokonał, SELECT * plonów Z T1 (READPAST) wartości 1, 2, 4, 5.READPAST przede wszystkim do zmniejszenia rywalizacja blokowania podczas implementowania kolejki pracy, który używa SQL Server tabela.Czytnik kolejki, który używa READPAST pomija w przeszłości zablokowany przez inne transakcje do następnej pozycji dostępne kolejki, bez konieczności poczekaj, aż inne transakcje zwolnić blokady ich wpisy kolejki.READPAST można określić dla każdej tabela w aktualizacji lub usunięcia instrukcjai dowolnej tabela w klauzulaFROM.Po określeniu w aktualizacji instrukcjaREADPAST jest stosowany tylko podczas odczytywania danych w celu identyfikacji rekordów do aktualizacji, niezależnie od tego, gdzie w instrukcja został określony.Nie można określić READPAST dla tabel w INTO klauzula INSERT instrukcja.Operacje odczytu, które używają READPAST do blok.Zaktualizować lub usunąć operacje używające READPAST maja blok podczas czytania kluczy obcych Widoki indeksowane lub modyfikowanie indeksów pomocniczych.
READPAST można określić tylko w pracy przy zatwierdzeniu odczytu lub odczyt POWTARZALNY poziomów izolacji transakcji.Po określeniu w transakcjach działające na MIGAWCE poziom izolacjiREADPAST musi być łączone z innych wskazówek tabela wymagających blokady, takich jak UPDLOCK i HOLDLOCK.
Wskazówka tabela READPAST nie można określić, kiedy opcja READ_COMMITTED_SNAPSHOT bazy danych jest zestaw na i jest spełniony jeden z następujących warunków.
Transakcja poziom izolacji sesja jest ODCZYTAĆ popełnione.
Wskazówka tabela parametr READCOMMITTED jest również określone w kwerendzie.
Aby określić wskazówka READPAST w tych przypadkach, usuń Wskazówka tabela parametr READCOMMITTED, jeśli jest obecny i zawierają wskazówkę tabela READCOMMITTEDLOCK w kwerendzie.
READUNCOMMITTED
Określa, że odczyt niezatwierdzonych danych są dozwolone.Nie blokady współużytkowane są wystawiane zapobiec innymi transakcjami modyfikację dane odczytane przez bieżącą transakcję i wyłącznej blokady zestaw przez inne transakcje do blok zablokowanych danych z bieżącej transakcji.Umożliwiające odczyt niezatwierdzonych danych może spowodować wyższą współbieżność, ale jest związany z odczytywania danych modyfikacje to następnie są przywracane przez inne transakcje.To może spowodować błędy dla transakcji, obecnych użytkowników z danymi, które nigdy nie zostało popełnione lub spowodować, że użytkownicy Zobacz rekordy dwukrotnie (lub wcale).Aby uzyskać więcej informacji na temat odczyt niezatwierdzonych danych, odczyty nonrepeatable i odczyty fantomu zobacz Efekty współbieżności.READUNCOMMITTED i NOLOCK wskazówki dotyczą tylko danych blokad.Wszystkie kwerendy, łącznie z tymi z wskazówki READUNCOMMITTED i NOLOCK nabywają Sch-S blokad (stabilność schematu) podczas kompilacji i wykonanie.Z tego powodu kwerendy są zablokowane, gdy jednoczesnych transakcji posiada Sch-M (modyfikacja schematu) blokada w tabela.Na przykład operacja języka (DDL) definicja danych nabywa Sch-M blokada przed modyfikuje informacji schematu tabela.Kwerend współbieżnych, łącznie z tymi z READUNCOMMITTED lub NOLOCK wskazówki są blokowane podczas próby uzyskania Sch-S blokada.I odwrotnie kwerenda gospodarstwa Sch-S blokada blokuje jednoczesnych transakcji, która próbuje uzyskać Sch-M blokada.Aby uzyskać więcej informacji na temat zachowania blokada zobacz Zablokuj zgodności (aparat bazy danych).
Nie można określić READUNCOMMITTED i NOLOCK tabel zmodyfikowany przez insert, update lub operacji usuwania.SQL Serveroptymalizator kwerendy ignoruje wskazówki READUNCOMMITTED i NOLOCK w klauzula FROM, które odnoszą się do miejsce docelowetabela aktualizacji lub usunięcia instrukcja.
Ostrzeżenie
Obsługa użycia wskazówek READUNCOMMITTED i NOLOCK w klauzula FROM, które odnoszą się do miejsce docelowe tabela aktualizacji lub usunięcia instrukcja zostaną usunięte w przyszłej wersja programu SQL Server.Plan do modyfikowania aplikacji, które używają obecnie i unikać te wskazówki w tym kontekście nowych prac rozwojowych.
Blokowanie rywalizacja można zminimalizować przy równoczesnej ochronie transakcji z dirty odczytuje dane nieprzekazane zmiany przy użyciu jednej z następujących czynności:
Przeczytaj POPEŁNIONYCH poziom izolacji z READ_COMMITTED_SNAPSHOT database opcja zestaw na.
MIGAWKA poziom izolacji.
Aby uzyskać więcej informacji na temat poziomów izolacji, zobacz Ustaw poziom izolacji transakcji (Transact-SQL).
Ostrzeżenie
Jeśli zostanie wyświetlony komunikat o błędzie 601 określonym READUNCOMMITTED, rozwiązać, podobnie jak w przypadku błędu zakleszczenie (1205) i ponów próbę instrukcja.
REPEATABLEREAD
Określa, że skanowanie jest wykonywane z tym samym blokowania semantyka jako transakcja z systemem na odczyt POWTARZALNY poziom izolacji.Aby uzyskać więcej informacji na temat poziomów izolacji, zobacz Ustaw poziom izolacji transakcji (Transact-SQL).ROWLOCK
Określa, że podejmowane są blokad wiersza, gdy podejmowane są zwykle blokad strona lub tabela .Po określeniu w transakcjach działające na MIGAWCE poziom izolacjiblokady wiersza nie zostaną podjęte chyba, że ROWLOCK w połączeniu z innymi wskazówki tabela wymagających blokady, takich jak UPDLOCK i HOLDLOCK.MOŻLIWY DO SERIALIZACJI
Odpowiada to HOLDLOCK.Powoduje, że współużytkowane blokady bardziej restrykcyjne przytrzymując je aż do zakończenia transakcji, zamiast zwalniania udostępnionego blokada , tak szybko, jak wymaganych danych lub tabela strona nie jest już potrzebna, czy transakcja została zrealizowana lub nie.Skanowanie jest wykonywane z tym samym semantyka jako transakcja z systemem na możliwy do SERIALIZACJI poziom izolacji.Aby uzyskać więcej informacji na temat poziomów izolacji, zobacz Ustaw poziom izolacji transakcji (Transact-SQL).TABLOCK
Określa podjęcia udostępnionego blokada tabela utrzymywane do czasu zakończenia-o-instrukcja.Jeżeli określony jest również HOLDLOCK, udostępnionych tabela blokada jest używana do zakończenia transakcji.Podczas importowania danych do sterty za pomocą INSERT INTO <target_table> zaznacz <kolumny> od <source_table> instrukcjamożna włączyć rejestrowanie zoptymalizowane oraz blokowania dla instrukcja , określając wskazówka TABLOCK dla miejsce docelowe tabela.Ponadto modelu odzyskiwanie bazy danych musi być zestaw na proste lub bulk-logged.Aby uzyskać więcej informacji, zobacz INSERT (Transact-SQL).
Gdy używana z OPENROWSET dostawca zbiorczych zestawów wierszy do importowania danych do tabela, TABLOCK umożliwia wielu klientów jednocześnie załadować danych do miejsce docelowe tabela z zoptymalizowane rejestrowania i blokowania.Aby uzyskać więcej informacji, zobacz Wymagania wstępne dotyczące minimalnych logowanie importu zbiorczego.
TABLOCKX
Określa podjęcia blokada na wyłączność w tabela.UPDLOCK
Określa, że aktualizacja blokady są pobrane i przechowywane aż do jej zakończenia.XLOCK
Określa, że blokada wyłączności są pobrane i przechowywane aż do jej zakończenia.Jeśli określona z ROWLOCK, PAGLOCK lub TABLOCK, wyłącznej blokady stosuje odpowiedni poziom ziarnistość.
Uwagi
Wskazówki dotyczące tabela są ignorowane, jeśli tabela nie jest używana przez planu kwerend.Może to być spowodowane przez optymalizator Rezygnacja z dostępu do tabela , lub z powodu indeksowany widok jest dostępny w zamian.W tym ostatnim przypadekdostęp do indeksowany widok można zapobiec za pomocą wskazówki dotyczącej kwerendy OPTION (rozwinąć WIDOKI).
Wszystkie blokada wskazówki są propagowane do wszystkich tabel i widoków, które są dostępne dla planu kwerend, w tym tabele i widoki, do którego odwołuje się w widoku.Ponadto SQL Server wykonuje odpowiednie blokada spójności kontroli.
Zablokuj wskazówek, że ROWLOCK, UPDLOCK, I XLOCK, które nabywają wierszapoziom blokowania może umieścić blokad kluczy indeksu zamiast wierszy danych rzeczywistych.Na przykład jeśli tabela ma indeks nieklastrowanyi wybierz instrukcja , przy użyciu Wskazówka blokada jest obsługiwany przez indeks obejmujący, blokada jest nabywany indeks klucz w indeksie obejmujący zamiast wiersz danych w tabela bazowa.
Jeśli tabela zawiera kolumny obliczane kolumny obliczane są obliczane przez wyrażenia lub funkcji dostęp do kolumn w innych tabelach, wskazówki tabela nie są używane w tych tabelach.Oznacza to, że wskazówek tabela nie są propagowane.Na przykład Wskazówka tabela NOLOCK jest określona w tabela w kwerendzie.W tej tabela obliczył kolumn, które są obliczane za pomocą kombinacji wyrażeń i funkcje, które dostęp do kolumny w innej tabela.Tabele odwołuje wyrażeń i funkcje należy używać NOLOCK Wskazówka tabela podczas uzyskiwania dostępu do.
SQL Servernie zezwala na więcej niż jednej tabela wskazówka z każdej z następujących grup dla każdej tabela w klauzulaFROM:
Rozdrobnienie wskazówki: PAGLOCK, NOLOCK, ROWLOCK, TABLOCK lub TABLOCKX.
Wskazówki do poziom izolacji: PARAMETR HOLDLOCK NOLOCK, READCOMMITTED, REPEATABLEREAD, MOŻLIWY DO SERIALIZACJI.
Filtrowane wskazówki Index
Filtrowane indeksu mogą być używane jako wskazówka tabela , ale spowoduje, że optymalizator kwerendy wygenerować błąd 8622, jeżeli nie obejmują wszystkie wiersze, które kwerenda wybiera.Oto przykład wskazówka nieprawidłowy indeks filtrowane.W przykładzie zostanie utworzony indeks filtrowane FIBillOfMaterialsWithComponentID i używa go jako wskazówka dla instrukcjaSELECT.Predykat filtrowane indeks zawiera wiersze danych dla ComponentIDs 533, 324 i 753.Predykat kwerenda także zawiera wiersze danych dla ComponentIDs 533, 324 i 753, ale rozciąga się zestaw wyników ComponentIDs 855 i 924, które nie są filtrowane indeksu.Dlatego optymalizator kwerendy nie można użyć wskazówki indeksu filtrowane i generuje błąd w 8622.Aby uzyskać więcej informacji, zobacz Filtrowane wskazówek indeksu.
USE AdventureWorks2008R2;
GO
IF EXISTS (SELECT name FROM sys.indexes
WHERE name = N'FIBillOfMaterialsWithComponentID'
AND object_id = OBJECT_ID(N'Production.BillOfMaterials'))
DROP INDEX FIBillOfMaterialsWithComponentID
ON Production.BillOfMaterials;
GO
CREATE NONCLUSTERED INDEX "FIBillOfMaterialsWithComponentID"
ON Production.BillOfMaterials (ComponentID, StartDate, EndDate)
WHERE ComponentID IN (533, 324, 753);
GO
SELECT StartDate, ComponentID FROM Production.BillOfMaterials
WITH( INDEX (FIBillOfMaterialsWithComponentID) )
WHERE ComponentID in (533, 324, 753, 855, 924);
GO
Jeśli Ustawianie opcji nie ma wymaganych wartości indeksów filtrowane optymalizator kwerendy nie rozważy wskazówką index.Aby uzyskać więcej informacji, zobacz CREATE INDEX (Transact-SQL).
Przy użyciu NOEXPAND
NOEXPAND dotyczy tylko widoki indeksowane.indeksowany widok to widok z unikatowego indeks klastrowany na nim tworzone.Jeśli kwerenda zawiera odwołania do kolumn, które są obecne, zarówno w indeksowany widok i tabel podstawowych i optymalizator kwerendy Określa, że przy użyciu indeksowany widok zapewnia najlepszą metoda wykonywania kwerendy, optymalizator kwerendy używa indeksu w widoku.Ta funkcja jest nazywana Dopasowanieindeksowany widoki jest obsługiwany tylko w SQL Server wersje Enterprise i Developer.
Jednakże dla optymalizatora rozważyć Widoki indeksowane do dopasowania lub wskazówka NOEXPAND za pomocą indeksowany widok , do którego odwołują się USTAWIĆ następujące opcje należy zestaw na:
KLAUZULE ANSI_NULLS |
ANSI_WARNINGS |
CONCAT_NULL_YIELDS_NULL |
SPOWODOWAŁYBY |
ARITHABORT1 |
QUOTED_IDENTIFIERS |
1 ARITHABORT jest niejawnie zestaw na gdy ANSI_WARNINGS jest zestaw na.W związku z tym nie trzeba ręcznie dostosować ustawienie.
Ponadto opcja NUMERIC_ROUNDABORT musi być zestaw na wyłączone.
Aby wymusić optymalizatora do indeksu indeksowany widok, należy określić opcję NOEXPAND.Ta wskazówka mogą być używane tylko wtedy, gdy widok nosi również w kwerendzie.SQL Servernie zapewnia podpowiedzi do wymuszenia określonego indeksowany widok używane w kwerendzie nie nazwę widoku, bezpośrednio w FROM klauzula; Jednakże optymalizator kwerendy uważa za pomocą widoków indeksowanych, nawet jeśli nie są wywoływane bezpośrednio w kwerendzie.
Aby uzyskać więcej informacji, zobacz Rozwiązywanie indeksów dla widoków.
Za pomocą wskazówka tabeli jako wskazówka dotycząca kwerendy
Wskazówki do tabeli może być określona jako wskazówka dotycząca kwerendy przy użyciu opcji (tabela wskazówka) klauzula.Zaleca się wskazówka tabela jako wskazówka dotycząca kwerendy tylko w kontekście przewodnik planu.Dla kwerend ad hoc należy określić te wskazówki tylko jako wskazówki do tabela .Aby uzyskać więcej informacji, zobacz Wskazówki kwerendy (Transact-SQL).
Uprawnienia
Wskazówki KEEPIDENTITY, IGNORE_CONSTRAINTS i IGNORE_TRIGGERS wymagają ZMIEŃ uprawnienia w tabela.
Przykłady
A.Określanie blokowania metodaza pomocą wskazówki TABLOCK
W następującym przykładzie określono podjęcia udostępnionego blokada Production.Product tabela i jest utrzymywana aż do końca instrukcjaUPDATE.
USE AdventureWorks2008R2;
GO
UPDATE Production.Product
WITH (TABLOCK)
SET ListPrice = ListPrice * 1.10
WHERE ProductNumber LIKE 'BK-%';
GO
B.Aby określić indeks wyszukiwania operacji przy użyciu wskazówka FORCESEEK
Następujące wskazówki FORCESEEK wymusić optymalizator kwerendy do wykonywania indeks wyszukiwania operacji na przykładzie wykorzystano Sales.SalesOrderDetail tabela.
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
Zobacz także