Filtrowane wskazówek indeksu

Filtrowane indeks jest zoptymalizowana indeks nieklastrowany szczególnie dostosowane do kwerendy tytułowych, które z dobrze podzbiór danych, wybierz.Predykat filtru wykorzystuje do indeksowania części wiersze w tabela.Dobrze filtrowane indeksu można poprawić kwerendy wydajności, zmniejszyć koszty eksploatacji indeksu i zmniejszyć indeks kosztów składowania w porównaniu z pełnym tabela indeksów.

Filtrowane indeksów można mają następujące zalety nad indeksy tabela pełnego:

  • Udoskonalone kwerendy wydajności i plan jakości

    Dobrze indeks filtrowane poprawia kwerendy wydajności i wykonanie planu jakości ponieważ jest mniejszy niż indeks nieklastrowany tabela pełnej i ma filtrowane dane statystyczne.Filtrowane dane statystyczne są bardziej dokładne niż statystyki pełnego tabela, ponieważ obejmują one tylko wiersze filtrowane indeksu.

  • Indeks obniżone koszty eksploatacji

    Indeks jest zachowywane tylko wtedy, gdy język edycji danych instrukcji (DML) wpływa na dane w indeksie.Filtrowane indeksu zmniejsza koszty utrzymania indeksu porównywane z indeks nieklastrowany pełnego tabela, ponieważ jest mniejszy i jest utrzymywany tylko, gdy dotyczy danych w indeksie.Jest możliwe dużej liczby indeksów przefiltrowane, zwłaszcza, gdy dane, które występuje rzadko.Podobnie jeśli filtrowane indeks zawiera często dotyczy danych, mniejszy rozmiar indeksu zmniejsza koszt aktualizacji statystyki.

  • Indeks obniżone koszty składowania

    Tworzenie indeksu filtrowane można zmniejszyć Magazyn dyskowy dla zbudowania indeksów nie klastrowanych, gdy indeks tabela pełnej nie jest konieczne.Można zastąpić tabela pełnej indeks nieklastrowany z wielu indeksów filtrowanych bez znaczący wzrost wymagań magazynu.

Uwagi dotyczące projektowania

W celu opracowania skutecznego indeksy filtrowane, jest zrozumieć, jakie kwerendy, aplikacja używa i ich relacji z podzbiorów danych.Przykładowe dane, które zostały wyraźnie określone podzbiory są kolumny z głównie NULL wartości, kolumny z kategoriami heterogenicznych wartości i kolumn o różnych zakresów wartości.Następujące uwagi dotyczące projektowania dają różne scenariusze po filtrowane indeksu może dostarczyć przewagę nad indeksy tabela pełnej.

Filtrowane indeksy dla podzbiorów danych

Gdy kolumna ma tylko niewielka liczba odpowiednie wartości dla kwerend, można utworzyć indeks filtrowane na podzbiór wartości.Na przykład wartości kolumna są przeważnie NULL, gdy kwerenda wybiera tylko z wartościami NIEZEROWYMI, można utworzyć filtrowane indeks dla wierszy danych NIEZEROWE.Wynikowy indeks będzie mniejsza i kosztu utrzymania niż indeks nieklastrowany pełnego tabela zdefiniowane w tej samej kolumny klucz.

Na przykład AdventureWorks2008R2 Baza danych zawiera Production.BillOfMaterials tabela z wierszy 2679. EndDate Kolumna ma 199 tylko wiersze zawierające wartość NIEZEROWĄ i inne wiersze 2480 zawierają wartości NULL.Następujące filtrowane indeks powinien obejmować kwerend, które zwracają kolumn zdefiniowanych w indeksie i, zaznacz tylko wiersze z wartością NIEZEROWĄ dla EndDate.

USE AdventureWorks2008R2;
GO
IF EXISTS (SELECT name FROM sys.indexes
    WHERE name = N'FIBillOfMaterialsWithEndDate'
    AND object_id = OBJECT_ID (N'Production.BillOfMaterials'))
DROP INDEX FIBillOfMaterialsWithEndDate
    ON Production.BillOfMaterials
GO
CREATE NONCLUSTERED INDEX FIBillOfMaterialsWithEndDate
    ON Production.BillOfMaterials (ComponentID, StartDate)
    WHERE EndDate IS NOT NULL ;
GO

Filtrowane indeksu FIBillOfMaterialsWithEndDate jest nieprawidłowy dla następującej kwerendy.Można wyświetlić plan wykonania kwerend, aby ustalić, jeśli optymalizator kwerendy używany indeks filtrowane.Aby uzyskać informacje o wyświetlaniu plan wykonania kwerend, zobacz Analizowanie kwerendy.

SELECT ProductAssemblyID, ComponentID, StartDate 
FROM Production.BillOfMaterials
WHERE EndDate IS NOT NULL 
    AND ComponentID = 5 
    AND StartDate > '01/01/2008' ;
GO

Aby uzyskać więcej informacji na temat tworzenia indeksów filtrowane i zdefiniować wyrażenie predykatu filtrowane indeksu, zobacz CREATE INDEX (Transact-SQL).

Indeksy filtrowanych danych heterogenicznych

Jeśli tabela ma dane niejednorodne wierszy, można utworzyć filtrowane indeksu dla jednej lub więcej kategorii danych.

Na przykład, produkty wymienione w Production.Product tabela każdego przypisanych do ProductSubcategoryID, które są z kolei skojarzony z kategorii produktów, rowery, składniki, ubrania lub akcesoria.Kategorie te są heterogenicznych, ponieważ ich kolumna wartości w Production.Product tabela nie są ściśle skorelowane.Na przykład kolor, ReorderPoint, ListPrice, waga, klasy i styl ma unikatową charakterystykę dla każdej kategorii produktów.Załóżmy, że są częste kwerendy dla Akcesoria, które mają podkategorie 27-36.Można poprawić wydajność kwerend Akcesoria, tworząc indeks filtrowane na podkategorie Akcesoria.

Poniższy przykład tworzy indeks filtrowane na wszystkie produkty w podkategoriach Akcesoria w Production.Product tabela.

USE AdventureWorks2008R2;
GO
IF EXISTS (SELECT name FROM sys.indexes
    WHERE name = N'FIProductAccessories'
    AND object_id = OBJECT_ID ('Production.Product'))
DROP INDEX FIProductAccessories
    ON Production.Product;
GO
CREATE NONCLUSTERED INDEX FIProductAccessories
    ON Production.Product (ProductSubcategoryID, ListPrice) 
        Include (Name)
WHERE ProductSubcategoryID >= 27 AND ProductSubcategoryID <= 36;
GO

Filtrowane indeksu FIProductAccessories obejmuje następujące kwerendy, ponieważ kwerendy

wyniki są zawarte w indeksie i planu kwerend nie ma odnośników tabela bazowa.Na przykład, wyrażenie predykatu kwerendy ProductSubcategoryID = 33 jest podzbiór predykatu filtrowane indeksu ProductSubcategoryID >= 27 i ProductSubcategoryID <= 36, ProductSubcategoryID i ListPrice kolumna w predykacie kwerendy są obie kolumna klucz w indeksie, a nazwa jest przechowywana na poziomie liścia indeksu jako dołączone kolumna.

SELECT Name, ProductSubcategoryID, ListPrice
FROM Production.Product
WHERE ProductSubcategoryID = 33 AND ListPrice > 25.00 ;
GO

Widoki vs.Filtrowane indeksów

Widok jest wirtualnego tabela , przechowuje definicji kwerendy; posiada szerszego celu i funkcji niż indeks filtrowane.Aby uzyskać więcej informacji o widokach, zobacz Opis widoków i Scenariusze korzystania z widoków.W poniższej tabela porównano niektóre funkcje dozwolone w widokach z tym odfiltrowane indeksy.

Dozwolone w wyrażeniach

Widoki

Filtrowane indeksów

Kolumny obliczane

Tak

Nie

sprzężenia

Tak

Nie

Wiele tabel

Tak

Nie

Logika porównywania proste w predykacie *

Tak

Tak

Logika złożonych w predykacie **

Tak

Nie

* Aby Logika porównywania proste w predykacie, zobacz Składnia klauzula WHERE w CREATE INDEX.

** Aby Logika porównywania złożonych w predykacie, zobacz Składnia klauzula WHERE Zaznacz.

Nie można utworzyć indeksu filtrowane w widoku.Jednakże optymalizator kwerendy mogą korzystać z indeksu przefiltrowane, zdefiniowane w tabela, która odwołuje się do widoku.optymalizator kwerendy uznaje filtrowane indeksu dla kwerendy wybierające z widoku, jeśli wyniki kwerendy będą poprawne.Poniższy przykład tworzy widok z dat rozpoczęcia po dniu 1 kwietnia 2000 r. i filtrowane indeksu z datami rozpoczęcia po 1 sierpnia 2000 r.

USE AdventureWorks2008R2;
GO
IF OBJECT_ID ('ViewOnBillOfMaterials') IS NOT NULL
DROP VIEW ViewOnBillOfMaterials;
GO
CREATE VIEW ViewOnBillOfMaterials AS 
SELECT ComponentID, StartDate, EndDate, StartDate + 2 AS ShipDate
FROM Production.BillOfMaterials
WHERE StartDate > '20000401';
GO
IF EXISTS (SELECT name FROM sys.indexes
    WHERE name = N'FIBillOfMaterialsByStartDate'
    AND object_ID = OBJECT_ID (N'Production.BillOfMaterials'))
DROP INDEX FIBillOfMaterialsByStartDate 
    ON Production.BillOfMaterials;
GO
CREATE NONCLUSTERED INDEX FIBillOfMaterialsByStartDate
    ON Production.BillOfMaterials (ComponentID, StartDate, EndDate)
WHERE StartDate > '20000801';
GO

W poniższym przykładzie kwerenda wybiera większa od 1 września 2004 r., daty rozpoczęcia, których wszystkie zawarte w indeksie filtrowane i filtrowanego widoku.optymalizator kwerendy uznaje filtrowane indeksu FIBillOfMaterialsByStartDate , ponieważ zawiera on poprawnych wyniki dla kwerendy.

SELECT StartDate, ComponentID FROM ViewOnBillOfMaterials
WHERE StartDate > '20040901';
GO

W następnym przykładzie kwerenda wybiera dat rozpoczęcia większa niż 1 czerwca 2004 r., które są wszystkie zawarte w widoku, ale nie w filtrowanym indeksu.optymalizator kwerendy nie uzna filtrowane indeksu FIBillOfMaterialsByStartDate , ponieważ kwerenda może zwracać różne wyniki przy użyciu indeksu filtrowane w porównaniu z prawidłowych wyników, gdy kwerenda wybiera się z widoku.

SELECT StartDate, ComponentID FROM ViewOnBillOfMaterials
WHERE StartDate > '20040601';
GO

Vs Widoki indeksowane.Filtrowane indeksów

Indeksy filtrowane mają następujące zalety nad Widoki indeksowane:

  • Obniżone koszty eksploatacji indeksu.Na przykład procesor kwerend używa mniej zasobów Procesora, aktualizować filtrowanych indeksu niż indeksowany widok.

  • Plan poprawy jakości.Na przykład podczas kompilacji kwerendy optymalizator kwerendy uznaje, przy użyciu indeksu filtrowane w sytuacjach więcej niż równoważne indeksowany widok.

  • Odtwarza indeks w trybie online.Filtrowane indeksów można odbudować podczas, gdy są one dostępne dla kwerend.Rebuilds online indeks nie są obsługiwane dla widoków indeksowanych.Aby uzyskać więcej informacji, zobacz opcję REBUILD Zmiana INDEKSU (Transact-SQL).

  • Indeksy nieunikatowe.Filtrowane indeksy mogą być nieunikatowy, widoki indeksowane muszą być unikatowe.

Z powyższych powodów zaleca filtrowane indeksu zamiast indeksowany widok, gdy to możliwe.Jest możliwe użycie indeksu filtrowane zamiast indeksowany widok po spełnieniu następujących warunków: odwołuje się do widoku tylko jedną tabela, kwerendy nie zwraca kolumny obliczane i predykat widoku używa logiki proste porównanie.Na przykład następujące wyrażenie predykatu jest dozwolone w definicji widoku, ale nie w filtrowanym indeksy, ponieważ zawiera LIKE operator.

WHERE StartDate > '20040701' AND ModifiedDate LIKE 'E%'

Kolumny klucza

Jest najlepiej obejmują niewielką liczbę klucz lub dołączone kolumny w definicji indeksu filtrowane i dołączyć kolumny, które są niezbędne dla optymalizator kwerendy wybrać filtrowane indeks plan wykonania kwerend.optymalizator kwerendy można wybrać filtrowane indeksu dla kwerendy niezależnie od czy ani nie obejmuje kwerendy.optymalizator kwerendy jest jednak bardziej prawdopodobne, wybierz indeks filtrowane, jeśli kwerenda obejmuje.Aby uzyskać więcej informacji na temat kwerend obejmujących Zobacz Tworzenie indeksów z uwzględnionych kolumn.

W niektórych przypadkach filtrowane indeks obejmuje kwerendy bez jak kolumny filtrowanej indeksu wyrażenie jako kolumny klucz lub zawarte w definicji indeksu filtrowane.Następujące wytyczne wyjaśniają, gdy kolumna w wyrażeniu filtrowane indeksu powinny być klucz lub zawarte w definicji indeksu filtrowane kolumna.Przykłady odnoszą się do indeksu filtrowane FIBillOfMaterialsWithEndDate utworzony wcześniej.

kolumna w wyrażeniu filtrowane indeksu musi być klucz lub zawarte w definicji indeksu filtrowane kolumna, jeśli wyrażenie filtrowane indeksu jest równoważne predykat kwerendy i kwerenda zwraca kolumna w wyrażeniu filtrowane indeksu z wyniki kwerendy.For example, FIBillOfMaterialsWithEndDate covers the following query because the query predicate is equivalent to the filter expression, and EndDate is not returned with the query results.FIBillOfMaterialsWithEndDate does not need EndDate as a key or included column in the filtered index definition.

SELECT ComponentID, StartDate FROM Production.BillOfMaterials
WHERE EndDate IS NOT NULL;
GO

kolumna w wyrażeniu filtrowane indeks powinien być klucz i kolumna w definicji indeksu filtrowane Jeśli predykat kwerendy używa kolumna porównania, który nie jest odpowiednikiem wyrażenie filtrowane indeksu.Na przykład FIBillOfMaterialsWithEndDate jest prawidłowa dla następującej kwerendy, ponieważ wybiera podzbiór wierszy z filtrowanym indeksu.Jednak nie obejmują następujące kwerendy ponieważ EndDate jest używany do porównania EndDate > '20040101', która jest nie równoważne wyrażenie filtrowane indeks.Procesor kwerend nie można wykonać tej kwerendy bez wyszukiwanie wartości EndDate.Dlatego EndDate powinien być klucz i kolumna w definicji indeksu filtrowanych.

SELECT ComponentID, StartDate FROM Production.BillOfMaterials
WHERE EndDate > '20040101';
GO

Kolumny w wyrażeniu filtrowane indeksu powinny być kolumny klucza lub zawarte w definicji indeksu filtrowane, jeśli kolumna jest w kwerendzie zestaw wyników.Na przykład FIBillOfMaterialsWithEndDate nie pokrywa następujące kwerendy, ponieważ zwraca EndDate kolumn w kwerendzie wyniki.Dlatego EndDate powinien być klucz i kolumna w definicji indeksu filtrowanych.

SELECT ComponentID, StartDate, EndDate FROM Production.BillOfMaterials
WHERE EndDate IS NOT NULL;
GO

Klucz podstawowy tabela nie musi być kluczem lub zawarte w definicji indeksu filtrowane kolumna.Klucz podstawowy jest automatycznie dołączany zbudowania indeksów, łącznie z filtrowanym indeksy.

Operatory konwersji danych w predykacie filtru

Jeżeli operator porównania określony w wyrażeniu filtrowane Indeks indeks filtrowane wyniki konwersji danych bezpośrednia lub pośrednia wystąpi błąd, jeśli konwersja nastąpi po lewej stronie operatora porównania.Rozwiązanie jest wyrażenie filtrowane indeksu z operator konwersji danych (RZUTOWANIA lub KONWERTUJ) po prawej stronie operator porównania.

Poniższy przykład tworzy tabela o różnych typach danych.

USE AdventureWorks2008R2;
GO
IF OBJECT_ID ('dbo.TestTable') IS NOT NULL
DROP TABLE dbo.TestTable;
GO
CREATE TABLE TestTable (a int, b varbinary(4));
GO

W poniższym filtrowane definicji indeksu kolumna b niejawnie konwertowane danych typu Liczba całkowita z porównanie z stała 1.Generuje komunikat o błędzie 10611, ponieważ konwersja nastąpi na lewej stronie operator w predykacie filtrowane.

USE AdventureWorks2008R2;
GO
IF EXISTS ( SELECT name from sys.indexes 
    WHERE name = N'TestTabIndex'
    AND object_id = OBJECT_ID (N'dbo.TestTable'))
DROP INDEX TestTabIndex on dbo.TestTable
GO
CREATE NONCLUSTERED INDEX TestTabIndex ON dbo.TestTable(a,b)
WHERE b = 1;
GO

Roztwór jest konwersja stała się tego samego typu jak kolumna po stronie prawej b, jak pokazano w następującym przykładzie:

CREATE INDEX TestTabIndex ON dbo.TestTable(a,b)
WHERE b = CONVERT(Varbinary(4), 1);
GO

Przenoszenie Konwersja danych od lewej do prawej stronie operator porównania może zmienić znaczenie konwersji.W powyższym przykładzie podczas dodawania po prawej stronie operator konwersji porównanie zmieniona z porównania całkowitych varbinary porównania.

Odwoływanie się do zależności

Sys.sql_wyrażenie_dependencies widok wykazu śledzi każdej kolumna filtrowanej indeksu wyrażenie jako odwołujący się zależność.Nie upuszczania, zmienić lub zmiany definicji kolumna tabela, która jest zdefiniowana w filtrowanym indeksu wyrażenie.

Kiedy używać indeksów filtrowane

Filtrowane indeksy są przydatne, gdy kolumny zawierają dobrze podzbiory danych kwerendy odwołujące się do instrukcji SELECT.Przykładami są:

  • Sparse kolumny, które zawierają tylko kilka wartości NIEZEROWE.

  • Heterogenicznych kolumny zawierające kategorie danych.

  • Kolumny zawierające zakresy wartości, takie jak kwoty dolara, czasi daty.

  • Tabela partycji, które są definiowane przez logikę proste porównanie kolumna wartości.

Koszty eksploatacji obniżone dla filtrowanych indeksów są najbardziej zauważalna, gdy liczba wierszy w indeksie jest mała w porównaniu z indeksu tabela pełnej.Filtrowane indeks obejmuje większość wiersze w tabela, można koszt więcej utrzymania niż indeks tabela pełnej.W takim przypadek należy używać indeksu tabela pełnego zamiast filtrowanego indeksu.

Filtrowane indeksy są zdefiniowane w jednej tabela i obsługują tylko operatory porównania proste.Wyrażenie filtru, które odwołuje się do wielu tabel lub zostało złożone logikę, należy należy utworzyć widok.

Filtrowane obsługę funkcji indeks

Ogólnie rzecz biorąc Aparat baz danych i narzędzia zapewniają obsługę tego samego filtrowane indeksy, które zapewniają zbudowania indeksów tabela pełnej, uwzględniając indeksy filtrowane jako specjalny rodzaj zbudowania indeksów.Poniższa lista zawiera uwagi dotyczące narzędzia i funkcje, które pełni obsługują, nie obsługują lub ograniczono obsługę filtrowane indeksy.

  • Indeks ZMIENIA obsługuje indeksy filtrowane.Aby zmodyfikować wyrażenie indeksu filtrowane, użyj utworzyć indeks Z DROP_EXISTING.

  • Brak funkcji indeksów nie sugeruje filtrowane indeksy.

  • Aparat baz danych Dostrajania klasyfikatora uważa indeksy filtrowane przy zalecaniu indeksu strojenia doradztwa i może zalecić is not null Filtrowane indeksu.

  • Operacji online indeksu obsługuje indeksy filtrowane.

  • Wskazówki tabeli obsługuje indeksy przefiltrowane, ale ma pewne ograniczenia, które nie dotyczą-filtrowane indeksy.Objaśniono je w poniższej sekcji.

Uwagi dotyczące kwerendy

optymalizator kwerendy można używać filtrowane indeksu, jeśli kwerenda wybiera te same wyniki z i bez użycia filtrowane indeksu.Filtrowane indeksu FIBillOfMaterialsWithEndDate opisane wcześniej jest nieprawidłowy dla następującej kwerendy dwóch.W pierwszym przykładzie predykat kwerenda jest dokładne dopasowanie do predykat filtrowane indeksu WHERE EndDate IS NOT NULL.W drugim przykładzie predykat kwerendy jest bardziej selektywne niż predykat filtru, ponieważ zawiera podzbiór wierszy w indeksie.

SELECT ComponentID, StartDate FROM Production.BillOfMaterials
WHERE EndDate IS NOT NULL;
GO
SELECT ComponentID, StartDate FROM Production.BillOfMaterials
WHERE EndDate < '20040701';
GO

Można również użyć kwerendy dalej FIBillOfMaterialsWithEndDate.Jednak Optymalizator może nie wybierać filtrowane indeksu z powodu innych czynników określających kwerendy kosztów, takie jak selektywność predykat kwerendy.Można wymusić Optymalizator wybrać filtrowane indeksu używając jako wskazówka dotycząca kwerendy jak pokazano w następującym przykładzie.

SELECT ComponentID, StartDate FROM Production.BillOfMaterials
    WITH ( INDEX ( FIBillOfMaterialsWithEndDate ) )
WHERE EndDate IN ('20040825', '20040908', '20040918');
GO

optymalizator kwerendy nie będzie używać indeksu filtrowane, jeśli kwerenda może zwracać wiersze, które nie są filtrowane indeksu.Na przykład optymalizator kwerendy nie rozpatrzy FIBillOfMaterialsWithEndDate dla następujące kwerendy, ponieważ jest możliwe dla kwerendy powrócić do wiersza o wartości NULL EndDate i inne niż null ModifiedDate, który nie może być w FIBillOfMaterialsWithEndDate , ponieważ zawiera tylko wartości NIEZEROWE dla EndDate.

SELECT ComponentID, StartDate FROM Production.BillOfMaterials
WHERE EndDate IS NOT NULL OR ModifiedDate IS NOT NULL;
GO

Jeśli filtrowany indeks jest używany jawnie jako wskazówka tabela i filtrowane indeks może nie zawierać wszystkich wyniki kwerendy, optymalizator kwerendy generuje błąd kompilacji kwerendy 8622.W poniższym przykładzie optymalizator kwerendy generuje błąd 8622, ponieważ FIBillOfMaterialsWithEndDate nie jest prawidłowy dla kwerendy i wyraźnie jest używana jako wskazówka:

SELECT StartDate, ComponentID FROM Production.BillOfMaterials
    WITH ( INDEX ( FIBillOfMaterialsWithEndDate ) )
WHERE EndDate IS NOT NULL OR ModifiedDate IS NOT NULL;
GO

Kwerend parametrycznych

W niektórych przypadkach, kwerenda parametryczna nie zawiera wystarczających informacji czas kompilacji dla optymalizator kwerendy wybrać filtrowane indeksu.Może być możliwe od nowa napisać kwerendę dostarczenie brakujących informacji.W poniższym przykładzie optymalizator kwerendy nie uzna filtrowane indeksu FIBillOfMaterialsWithComponentID dla instrukcja SELECT, ponieważ wartości parametru @p i @q nie są znane czas kompilacji.W poniższym przykładzie kwerenda jest uruchamiana z SHOWPLAN_XML zestaw on tak niedopasowanych filtrowane indeksy dla kwerend parametrycznych można wyświetlić w wyniku SHOWPLAN_XML.

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
SET SHOWPLAN_XML ON;
GO
DECLARE @p AS INT, @q AS INT;
SET @p = 533;
SET @q = 324;
SELECT StartDate, ComponentID from Production.BillOfMaterials 
WHERE ComponentID = @p OR ComponentID = @q;
GO
SET SHOWPLAN_XML OFF;
GO

UnmatchedIndexes Element i Parameterization podelement w wyniku SHOWPLAN_XML wskazują, że indeks filtrowany był nie pasuje do kwerendy.Aby uzyskać informacje dotyczące sposobu wyświetlania danych wyjściowych SHOWPLAN_XML, zobacz XML Showplans.

Roztwór jest aby zmodyfikować kwerendę tak, aby wyniki kwerendy są puste, gdy wyrażenie parametryczne nie jest podzbiór predykatu filtru.Poniższa kwerenda przedstawia modyfikacji.Dodając ComponentID in (533, 324, 753) wyrażenia klauzula WHERE wyniki kwerendy są gwarantowana podzbiór filtrowanej wyrażenie predykatu.Z ta modyfikacja optymalizator kwerendy można rozważyć filtrowane indeksu FIBillOfMaterialsWithComponentID dla następujących SELECT instrukcja.

USE AdventureWorks2008R2;
GO
SET SHOWPLAN_XML ON;
GO
DECLARE @p AS INT, @q AS INT;
SET @p = 533;
SET @q = 324;
SELECT StartDate, ComponentID FROM Production.BillOfMaterials
WHERE ComponentID in (533, 324, 753)
    AND (ComponentID = @p OR ComponentID = @q);
GO
SET SHOWPLAN_XML OFF;
GO

Parametryzacja proste

W większości przypadków optymalizator kwerendy nie będzie wykonywać proste parametryzacja (zwany "auto parametryzacja" w SQL Server 2005) na podstawie kwerendy, jeśli plan kwerend zawiera indeks filtrowanych.Wykonywanie prostych parametryzacja na takie kwerendy można poszerzyć zakres wartości parametrów możliwe, tak aby filtrowane indeksu nie gwarantuje dokładności wyniki kwerendy.Na przykład optymalizator kwerendy może nie wykonać proste parametryzacja, jeśli klauzula WHERE instrukcja SELECT używa kolumna używana w predykacie filtrowane indeksu, ponieważ jest prawdopodobne, że plan kwerendy będzie zawierać przefiltrowane indeksu.

Gdzie właściwe, można parameterize kwerendy przez poprawiania go zapewnienia filtrowane indeksu za pomocą wytycznych opisanych w tej sekcji obejmuje kwerendy.

Kwerend za pomocą klucza wyszukiwania

optymalizator kwerendy można używać filtrowane indeksu, mimo że nie obejmuje kwerendy, wykonując klucz wyszukiwania pobrać pozostałych kolumn, które filtrowane indeksu nie obejmuje.Aby uzyskać więcej informacji na temat klucz wyszukiwania, zobacz Klucza wyszukiwania Showplan operatora.optymalizator kwerendy może wybrać tego podejścia, jeśli szacowana liczba wyszukiwań klucz jest mała.Następująca kwerenda używa wskazówką index wymusić procesor kwerend do używania FIBillOfMaterialsWithEndDate z wyszukiwań zakładki dla EndDate.Wyszukiwanie klucz występuje dla EndDate > @date porównania w predykacie kwerendy.

USE AdventureWorks2008R2;
GO
DECLARE @date AS DATE;
SET @date = '20040825'
SELECT ComponentID, StartDate, EndDate FROM Production.BillOfMaterials
WITH ( INDEX (FIBillOfMaterialsWithEndDate) )
WHERE EndDate > @date;
GO

Należy zauważyć, że EndDate > @Date jest dokładny odpowiednik wyrażenie filtrowane indeksu EndDate IS NOT NULL.Filtrowane indeks jest nadal ważny dla tej kwerendy parametryczne, ponieważ zwraca podzbiór wierszy zdefiniowanych przez wyrażenie filtrowane indeksu.