CREATE INDEX (Transact-SQL)

Tworzy indeks relacyjnej w określonej tabela lub widoku w określonej tabela.Zanim dane w tabela, można utworzyć indeks.Relacyjne indeksy mogą być tworzone na tabel lub widoków w innej bazie danych przez określenie nazwy kwalifikowanej bazy danych.

Ostrzeżenie

Aby uzyskać informacje na temat tworzenia indeksu XML, zobacz Tworzenie INDEKSU XML (Transact-SQL).Aby uzyskać informacje dotyczące tworzenia indeksu przestrzennej, zobacz Utwórz indeks PRZESTRZENNY (Transact-SQL).

Ikona łącza do tematuJęzyka Transact-SQL składni konwencje

Składnia

Create Relational Index 
CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name 
    ON <object> ( column [ ASC | DESC ] [ ,...n ] ) 
    [ INCLUDE ( column_name [ ,...n ] ) ]
    [ WHERE <filter_predicate> ]
    [ WITH ( <relational_index_option> [ ,...n ] ) ]
    [ ON { partition_scheme_name ( column_name ) 
         | filegroup_name 
         | default 
         }
    ]
    [ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ]

[ ; ]

<object> ::=
{
    [ database_name. [ schema_name ] . | schema_name. ] 
    table_or_view_name
}

<relational_index_option> ::=
{
    PAD_INDEX = { ON | OFF }
  | FILLFACTOR = fillfactor
  | SORT_IN_TEMPDB = { ON | OFF }
  | IGNORE_DUP_KEY = { ON | OFF }
  | STATISTICS_NORECOMPUTE = { ON | OFF }
  | DROP_EXISTING = { ON | OFF }
  | ONLINE = { ON | OFF }
  | ALLOW_ROW_LOCKS = { ON | OFF }
  | ALLOW_PAGE_LOCKS = { ON | OFF }
  | MAXDOP = max_degree_of_parallelism
  | DATA_COMPRESSION = { NONE | ROW | PAGE} 
     [ ON PARTITIONS ( { <partition_number_expression> | <range> } 
     [ , ...n ] ) ]
}

<filter_predicate> ::= 
    <conjunct> [ AND <conjunct> ]

<conjunct> ::=
    <disjunct> | <comparison>

<disjunct> ::=
        column_name IN (constant ,...n)

<comparison> ::=
        column_name <comparison_op> constant

<comparison_op> ::=
    { IS | IS NOT | = | <> | != | > | >= | !> | < | <= | !< }

<range> ::= 
<partition_number_expression> TO <partition_number_expression>


Backward Compatible Relational Index
Important   The backward compatible relational index syntax structure will be removed in a future version of SQL Server. Avoid using this syntax structure in new development work, and plan to modify applications that currently use the feature. Use the syntax structure specified in <relational_index_option> instead.

CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name 
    ON <object> ( column_name [ ASC | DESC ] [ ,...n ] ) 
    [ WITH <backward_compatible_index_option> [ ,...n ] ]
    [ ON { filegroup_name | "default" } ]

<object> ::=
{
    [ database_name. [ owner_name ] . | owner_name. ] 
    table_or_view_name
}

<backward_compatible_index_option> ::=
{ 
    PAD_INDEX
  | FILLFACTOR = fillfactor
  | SORT_IN_TEMPDB
  | IGNORE_DUP_KEY
  | STATISTICS_NORECOMPUTE 
  | DROP_EXISTING 
}

Argumenty

  • UNIKATOWE
    Tworzy indeks unikatowy w tabela lub widoku.indeks unikatowy jest jeden, w którym żadne dwa wiersze mogą mieć tej samej wartości klucz indeksu.indeks klastrowany w widoku musi być unikatowa.

    Aparat baz danych Nie zezwala na tworzenie indeks unikatowy w kolumnach, które już zawierają zduplikowane wartości lub nie IGNORE_DUP_KEY jest zestaw na.Jeśli zostanie podjęta próba, Aparat baz danych wyświetla komunikat o błędzie.Można utworzyć indeks unikatowy na kolumna lub kolumny, należy usunąć zduplikowane wartości.Kolumny, które są używane w indeks unikatowy powinien być zestaw na nie NULL, ponieważ wiele wartości null są traktowane jako duplikaty, podczas tworzenia indeks unikatowy .

  • KLASTROWANY
    Tworzy indeks, w którym logicznemu porządkowi wartości klucz określa kolejność fizyczna odpowiadające im wiersze w tabela.U dołu lub liśćz poziom indeks klastrowany zawiera rzeczywiste dane wierszy tabela.tabela lub widok jest dozwolone jeden indeks klastrowany w czas.Aby uzyskać więcej informacji, zobacz Struktury indeksu klastrowanego.

    Widok z unikatowego indeks klastrowany nosi nazwę indeksowany widok.Tworzenie unikatowego indeks klastrowany w widoku fizycznie zostaje widoku.Należy utworzyć unikatowego indeks klastrowany w widoku wszystkie indeksy mogą być definiowane w tym samym widoku.Aby uzyskać więcej informacji, zobacz Projektowanie widoków indeksów.

    Przed utworzeniem zbudowania indeksów, należy utworzyć indeks klastrowany .Tworzony jest indeks klastrowany odbudowa zbudowania indeksów istniejące w tabelach.

    Jeżeli nie określono CLUSTERED, tworzony jest indeks nieklastrowany .

    Ostrzeżenie

    Ponieważ liść poziom indeks klastrowany i danych stron są takie same, z definicji, tworzenie indeks klastrowany i korzystanie z partition_scheme_name lub na filegroup_name klauzula skutecznie przenosi tabela z grupa plików , tworzenia tabela do nowego schemat partycji lub grupa plików.Przed utworzeniem tabel lub indeksów na szczególne aplikacjami, sprawdź aplikacjami, które są dostępne i mają puste miejsca dla indeksu.Aby uzyskać więcej informacji, zobacz Określanie wymagań dotyczących miejsca na dysku indeksu.

  • NIEKLASTROWANY
    Tworzy indeks, który określa logicznej kolejności tabela.Z indeks nieklastrowanyfizyczny porządek wierszy danych jest niezależna od kolejności ich indeksowanych.Aby uzyskać więcej informacji, zobacz Struktury indeks nieklastrowany.

    Każda tabela może mieć maksymalnie 999 ponownego zbudowania indeksów, niezależnie od tego, jak tworzone są indeksy: albo niejawnie z kluczem PODSTAWOWYM i ograniczeń UNIQUE, wyraźnie CREATE INDEX.

    Widoki indeksowane zbudowania indeksów nie klastrowanych mogą być tworzone tylko na widok, który ma unikatowy indeks klastrowany już zdefiniowany.

    Wartość domyślna to NONCLUSTERED.

  • index_name
    Jest to nazwa indeksu.Nazwy indeksów muszą być unikatowe w tabela lub widoku, ale nie muszą być unikatowe w bazie danych.Nazwy indeksów muszą spełniać zasady z identyfikatorów.

  • column
    Jest kolumna lub kolumn, na których oparty jest indeks.Określ dwa lub więcej nazw kolumna do tworzenia indeks złożony na połączone wartości w określonych kolumnach.Lista kolumn, które mają zostać uwzględnione w indeks złożony, w kolejności priorytet sortowania w nawiasach po table_or_view_name.

    Do 16 kolumn można połączyć w jeden indeks złożony klucz.Wszystkie kolumny indeks złożony klucz musi być w tej samej tabela lub widoku.Maksymalny dozwolony rozmiar wartości indeksu łączonego wynosi 900 bajtów.

    Kolumny, które mają typ danych dużego obiektu (LOB) ntext, text, varchar(max), nvarchar(max), varbinary(max), xml, lub image nie może być określony jako kolumny klucz dla indeksu.Ponadto nie może zawierać definicję widoku ntext, text, lub image kolumny, nawet jeśli nie są wywoływane w instrukcjaCREATE INDEX.

    Jeśli obsługuje typ binarny zamawiania, można utworzyć indeksy na kolumnach zdefiniowany przez użytkownika typ CLR .Można również utworzyć indeksy na kolumny obliczane, które są zdefiniowane jako wywołania metoda z typ zdefiniowany przez użytkownika kolumna, tak długo, jak metody są oznaczane przewidywalne i nie należy wykonywać operacji dostępu do danych.Aby uzyskać więcej informacji na temat indeksowania kolumny zdefiniowany przez użytkownika typ CLR , zobacz typów zdefiniowanych przez użytkownika CLR.

  • [ ASC | DESC]
    Określa, czy malejącej kierunek sortowania dla określonego indeksu kolumna.Wartość domyślna to ASC.

  • INCLUDE **(**column [ ,... n ] )
    Określa bez-kolumnklucz ma zostać dodany do liść poziom indeks nieklastrowany.indeks nieklastrowany może być unikatowy lub nieunikatowy.

    Nazwy kolumn nie może być powtórzona w liście DOŁĄCZANIA i nie może być używane jednocześnie jako zarówno klucz i nie-kolumnklucz .Zbudowania indeksów nie klastrowanych zawsze zawiera kolumny indeks klastrowany , jeśli indeks klastrowany jest zdefiniowany w tabela.Aby uzyskać więcej informacji, zobacz Indeks z uwzględnionych kolumn.

    Dozwolone są wszystkie typy danych z wyjątkiem text, ntext, i image.Należy utworzyć indeksu lub przebudowanych w trybie offline (ONLINE = OFF) Jeśli dowolnego z określonym nie-kolumnyklucz są varchar(max), nvarchar(max), lub varbinary(max) typów danych.

    Obliczane kolumny, które są przewidywalne i dokładne lub niedokładny może być uwzględnionych kolumn.Obliczone kolumn pochodzących z image, ntext, text, varchar(max), nvarchar(max), varbinary(max), i xml typy danych mogą być zawarte w innych niż - tak długo, jak typy danych kolumna obliczanej kolumnyklucz jest dopuszczalne jako dołączone kolumna.Aby uzyskać więcej informacji, zobacz Tworzenie indeksów kolumny obliczanej.

    Aby uzyskać informacje dotyczące tworzenia indeksu XML, zobacz Tworzenie INDEKSU XML (Transact-SQL).

  • W przypadku gdy <filter_predicate>
    Tworzy indeks przefiltrowane, określając wierszy, które należy uwzględnić w indeksie.Filtrowane indeksu musi być indeks nieklastrowany na tabela.Tworzy filtrowane dane statystyczne dotyczące wierszy danych w indeksie filtrowane.

    Filtr predykat Logika porównywania prostego zastosowania i nie można odwoływać się kolumnaobliczana, UDT kolumna, typ dane przestrzenne kolumna, lub hierarchyID Typ danych kolumna.Operatory porównania porównań za pomocą literałów wartości NULL są niedozwolone.Zamiast tego należy używać operatorów jest puste i nie jest NULL.

    Oto kilka przykładów predykaty filtru dla Production.BillOfMaterials tabela:

    WHERE StartDate > '20040101' AND EndDate <= '20040630'

    WHERE ComponentID IN (533, 324, 753)

    WHERE StartDate IN ('20040404', '20040905') AND EndDate IS NOT NULL

    Filtrowane indeksów nie dotyczą indeksy XML i indeksy pełnotekstowe.Dla indeksów unikatowych zaznaczone wiersze muszą mieć wartości indeks unikatowy .Filtrowane indeksów nie zezwalają opcji IGNORE_DUP_KEY.

  • ON partition_scheme_name**(column_name)**
    Określa schemat partycji definiuje aplikacjami, na który będzie mapowany partycji indeks partycjonowany .schemat partycji musi istnieć w bazie danych, wykonując jedną Schemat tworzenia PARTYCJI lub Zmienić schemat PARTYCJI.column_nameOkreśla kolumna , przeciwko któremu indeks partycjonowany będzie można podzielić na partycje.W tej kolumna muszą być zgodne, typ danych, długość i dokładność argumentu funkcja partition, partition_scheme_name jest za pomocą.column_namenie jest ograniczone do kolumn w definicji indeksu.Wszystkie kolumna w tabela bazowa można określić, z wyjątkiem sytuacji gdy partycjonowanie indeksu UNIKATOWEGO, column_name musi być wybrana spośród tych używanych jako unikatowy klucz.Umożliwia to ograniczenie Aparat baz danych sprawdzić unikatowości wartości klucz tylko jednej partycji.

    Ostrzeżenie

    Po partycji nieunikatowy, indeks klastrowany Aparat baz danych domyślnie dodaje partycjonowanie kolumna do listy kluczy indeks klastrowany , jeśli nie zostanie określona.Podczas nieunikatowy partycjonowanie , indeks nieklastrowany Aparat baz danych dodaje partycjonowanie kolumna jako nie-klucz (dołączone) kolumna indeksu, jeśli nie zostanie określona.

    Jeśli partition_scheme_name lub filegroup nie jest określony i tabela jest podzielony na partycje, w tym samym schemat partycji, przy użyciu tej samej partycjonowanie kolumna, w tabelapodstawowej jest umieszczony indeks.

    Ostrzeżenie

    Schemat partycjonowanie nie można określić w indeksie XML.Jeśli tabela bazowa jest podzielony na partycje, indeks XML używa tego samego schemat partycji jako tabela.Aby uzyskać informacje dotyczące tworzenia indeksu XML, zobacz Tworzenie INDEKSU XML (Transact-SQL).

    Aby uzyskać więcej informacji o partycjonowanie indeksy, zobacz Specjalne wytyczne dla indeksów podzielonym na partycje.

  • NAfilegroup_name
    Tworzy indeks określonego w określonej grupa plików.Jeśli lokalizacja nie jest określony, tabela lub widok nie jest partycją indeks używa tej samej grupa plików jako podstawowej tabela lub widoku.grupa plików musi już istnieć.

  • NA "domyślną""
    Tworzy indeks określonego w domyślnej grupa plików.

    Domyślny czas w tym kontekście nie jest słowem kluczowym.Jest to identyfikator domyślnej grupa plików i musi być rozdzielany w sprawie "domyślną" lub na domyślne**[]**.Jeśli "domyślny" jest określony, opcja QUOTED_IDENTIFIER musi być w bieżącej sesja.Jest to ustawienie domyślne.Aby uzyskać więcej informacji, zobacz ZESTAW QUOTED_IDENTIFIER (Transact-SQL).

  • [ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ]
    Określa położenie FILESTREAM danych dla tabela , gdy tworzony jest indeks klastrowany .FILESTREAM_ON klauzula umożliwia FILESTREAM danych ma zostać przeniesiona do różnych FILESTREAM grupa plików lub schemat partycji.

    filestream_filegroup_namejest nazwą FILESTREAM grupa plików.grupa plików musi mieć jeden plik zdefiniowane dla grupa plików za pomocą Tworzenie bazy danych lub ALTER DATABASEinstrukcja; w przeciwnym razie powstaje błąd.

    Jeśli tabela jest podzielony na partycje, FILESTREAM_ON klauzula muszą być włączone i należy określić schemat partycji aplikacjami FILESTREAM, który używa tej samej partycji funkcja i partycji kolumny jako schemat partycji tabela.W przeciwnym razie powstaje błąd.

    Jeśli tabela nie jest podzielony na partycje, FILESTREAM kolumna nie można podzielić na partycje.FILESTREAM danych dla tabela muszą być przechowywane w pojedynczym grupa plików określonego w klauzulaFILESTREAM_ON.

    FILESTREAM_ON NULL można określić w instrukcja CREATE INDEX Jeśli tworzony jest indeks klastrowany i tabela nie zawiera FILESTREAM kolumna.

    Aby uzyskać listę tematów FILESTREAM zobacz Projektowanie i wdrażanie FILESTREAM magazynu.

<obiekt>:: =

Jest w pełni kwalifikowana lub nonfully kwalifikowaną obiektu mają być indeksowane.

  • database_name
    Jest to nazwa bazy danych.

  • schema_name
    Jest to nazwa schematu, do której należy dany tabela lub widoku.

  • table_or_view_name
    Jest nazwą tabela lub widoku mają być indeksowane.

    Widok musi być zdefiniowana z SCHEMABINDING, aby utworzyć indeks.Należy utworzyć unikatowego indeks klastrowany w widoku wszystkie indeks nieklastrowany jest tworzony.Aby uzyskać więcej informacji na temat widoków indeksowanych zobacz sekcję Spostrzeżenia.

<relational_index_option>:: =

Określa opcje podczas tworzenia indeksu.

  • PAD_INDEX = {ON | OFF }
    Określa indeks uzupełnienie.Domyślnie jest wyłączona.

    • NA
      Procent wolnego miejsca, która jest określona przez fillfactor jest stosowany do stronypoziom pośredniego-indeks.

    • Wyłączanie lub fillfactor nie jest określony
      Stronypoziom pośredniego - są wypełnione bliskiej zdolności, pozostawiając wystarczająco dużo miejsca dla co najmniej jeden wiersz maksymalny rozmiar indeksu może mieć, biorąc pod uwagę zestaw kluczy na stronach pośrednich.

    Opcja PAD_INDEX jest przydatna w tylko wtedy, gdy FILLFACTOR jest określony, ponieważ PAD_INDEX używa wartości procentowej określonej przez FILLFACTOR.Jeśli wartość procentowa określona dla FILLFACTOR nie jest wystarczająco duży, aby umożliwić jeden wiersz Aparat baz danych wewnętrznie zastępuje procent, aby umożliwić minimum.Liczba wierszy na pośrednich strona indeksu nigdy nie jest mniejsza niż dwóch niezależnie od sposobu niskiej wartości z fillfactor.

    Składnia zgodna z poprzednimi wersjami, Z PAD_INDEX jest równoważne Z PAD_INDEX = ON.

  • FILLFACTOR **=**fillfactor
    Określa wartość procentową, która wskazuje, jak pełne Aparat baz danych należy ustawić liść poziom każdej strona indeksu podczas tworzenia indeksu lub rekonstrukcji.fillfactormusi mieć wartość całkowitą od 1 do 100.Wartość domyślna to 0.Jeśli fillfactor jest 100 lub 0, Aparat baz danych tworzy indeksy z liść strony wypełniony do pojemności.

    Ostrzeżenie

    Wartości współczynnika wypełnienia 0 i 100 są takie same pod każdym względem.

    Ustawienie FILLFACTOR dotyczy tylko wtedy, gdy indeks jest tworzony lub przebudowanych.Aparat baz danych Nie dynamicznie zachować określony procent wolnego miejsca w stronach.Aby wyświetlić ustawienie współczynnik wypełnienia , użyj sys.indexes katalogu widoku.

    Ważna informacjaWażne:

    Tworzenie indeks klastrowany z FILLFACTOR mniej niż 100 wpływa na ilość miejsca do magazynowania danych zajmuje, ponieważ Aparat baz danych rozkłada danych podczas tworzenia indeks klastrowany.

    Aby uzyskać więcej informacji, zobacz Współczynnik wypełnienia.

  • SORT_IN_TEMPDB = {ON | OFF }
    Określa, czy do przechowywania tymczasowych Sortuj wyniki w tempdb.Domyślnie jest wyłączona.

    • NA
      Pośrednie sortowania wyniki , używany do tworzenia indeksu są przechowywane w tempdb.Może to zmniejszyć czas wymagany do utworzenia indeksu, jeśli tempdb na inny zestaw dysków baza danych użytkownika.Jednak zwiększa ilość miejsca na dysku, który jest używany podczas budowania indeksu.

    • WYŁĄCZANIE
      Pośrednie Sortuj wyniki są przechowywane w tej samej bazy danych jako indeks.

    Oprócz przestrzeni wymagane w baza danych użytkownika , aby utworzyć indeks tempdb musi mieć informacje o tej samej ilości dodatkowego miejsca do przechowywania wynikipośrednich sortowania.Aby uzyskać więcej informacji, zobacz tempdb i tworzenie indeksu.

    Składnia zgodna z poprzednimi wersjami, Z SORT_IN_TEMPDB jest równoważne Z SORT_IN_TEMPDB = ON.

  • IGNORE_DUP_KEY = {ON | OFF }
    Określa odpowiedź błąd podczas operacji wstawiania spróbuje wstawić wartości zduplikowany klucz do indeks unikatowy.Opcja IGNORE_DUP_KEY dotyczy tylko wstawianie operacji po utworzeniu indeksu lub przebudowanych.Opcja nie ma wpływu podczas wykonywania CREATE INDEX, Zmianę INDEKSU, lub Aktualizacja.Domyślnie jest wyłączona.

    • NA
      Komunikat ostrzegawczy ma miejsce, gdy wartości zduplikowanych klucz są wstawiane do indeks unikatowy.Tylko wiersze naruszenie ograniczenia unikatowości nie powiedzie się.

    • WYŁĄCZANIE
      Komunikat o błędzie ma miejsce, gdy wartości zduplikowanych klucz są wstawiane do indeks unikatowy.Cała operacja WSTAWIANIA zostanie wycofana.

    IGNORE_DUP_KEY nie może być zestaw na indeksy utworzone na widok, indeksów — unikatowy, indeksy XML, indeksy przestrzenne i filtrowane indeksy.

    Służy do wyświetlania IGNORE_DUP_KEY, sys.indexes.

    Składnia zgodna z poprzednimi wersjami, Z IGNORE_DUP_KEY jest równoważne Z IGNORE_DUP_KEY = ON.

  • STATISTICS_NORECOMPUTE = {ON | OFF}
    Określa, czy są przeliczane statystyk dystrybucji.Domyślnie jest wyłączona.

    • NA
      Poza-o-data statystyki nie są automatycznie przeliczane.

    • WYŁĄCZANIE
      Statystyka automatyczne aktualizowanie są włączone.

    Aby przywracanie Statystyka automatyczne aktualizowanie, zestaw STATISTICS_NORECOMPUTE na OFF lub wykonać aktualizacji statystyk bez NORECOMPUTE klauzula.

    Ważna informacjaWażne:

    Wyłączanie automatycznego recomputation statystyk dystrybucji może uniemożliwić pobrania optymalnej realizacji planów kwerend obejmujących tabela optymalizator kwerendy .

    Składnia zgodna z poprzednimi wersjami, Z STATISTICS_NORECOMPUTE jest równoważne Z STATISTICS_NORECOMPUTE = ON.

  • DROP_EXISTING = {ON | OFF }
    Określa, że nazwany, istniejący wcześniej klastrowany lub nieklastrowany zostanie usunięty, a przebudowany.Domyślnie jest wyłączona.

    • NA
      Istniejący indeks jest opuszczane, a następnie ponownie zbudowana.Określona nazwa indeksu musi być taka sama, jak aktualnie istniejący indeks; Jednakże można modyfikować definicję indeksu.Na przykład można określić różne kolumny, kolejność sortowania, schemat partycjilub opcje indeksu.

    • WYŁĄCZANIE
      Błąd jest wyświetlany, jeśli nazwa określony indeks już istnieje.

    Typ indeksu nie można zmienić przy użyciu DROP_EXISTING.

    Składnia zgodna z poprzednimi wersjami, Z DROP_EXISTING jest równoważne Z DROP_EXISTING = ON.

  • ONLINE = {ON | OFF }
    Określa, czy tabele podstawowe i indeksy skojarzone są dostępne do modyfikacji kwerendy i danych podczas operacji indeksu.Domyślnie jest wyłączona.

    Ostrzeżenie

    Operacje indeksu online są dostępne tylko w SQL Server wersji Enterprise, Developer i oceny.

    • NA
      Długoterminowe blokady tabela nie są aktywne przez czas trwania operacji indeksu.Główne fazie operacji indeksu tylko intencji udziału (IS) blokada jest używana wtabela źródło. Dzięki temu kwerendy lub aktualizacje z tabela i indeksy, aby kontynuować.W momencie rozpoczęcia operacji udostępnione (S) blokada jest używana na obiekt źródło w bardzo krótkim okresie czas.Na końcu operacji przez krótki okres czas, S (udostępniany) blokada jest nabywany źródło Jeśli tworzony jest indeks nieklastrowany ; lub SCH-M (modyfikacja schematu) blokada jest nabyte podczas tworzenia indeks klastrowany lub porzucone w trybie online i klastrowany lub indeks nieklastrowany są przebudowywane.ONLINE nie można zestaw na po utworzeniu indeks w lokalnej tabelatymczasowej.

    • WYŁĄCZANIE
      Blokady tabeli są stosowane na czas trwania operacji indeksu.Operację indeks w trybie offline, która tworzy, buduje ponownie, lub porzuca indeks klastrowanylub odbudowania lub spadnie indeks nieklastrowanynabywa modyfikacji (Sch-M) schematu blokada w tabela.Uniemożliwia to dostęp użytkownika do odpowiedniej tabela , na czas trwania operacji.Operacja indeks w trybie offline, który tworzy indeks nieklastrowany nabywa udostępnione (S) blokada w tabela.Zapobiega aktualizacji do podstawowej tabela , ale zezwala na operacje odczytu, takich jak instrukcje SELECT.

    Aby uzyskać więcej informacji, zobacz Jak Online pracy operacji indeksu.Aby uzyskać więcej informacji na temat blokady zobacz Tryby Lock.

    Indeksy, w tym indeksów na globalne tabele tymczasowe mogą być tworzone online z następującymi wyjątkami:

    • Indeks XML.

    • Indeks w lokalnej tabelatemp.

    • Początkowe unikatowego indeks klastrowany w widoku.

    • Indeksy klastrowane wyłączone.

    • Indeks klastrowany, jeśli tabela zawiera typy dane LOB: image, ntext, text,varchar(max), nvarchar(max), varbinary(max), and xml.

    • Indeks nieklastrowany zdefiniowana z dane LOB typu kolumny.

      Ostrzeżenie

      Nieunikatowy indeks nieklastrowany mogą być tworzone online, jeśli tabela zawiera typy dane LOB, ale żadna z tych kolumn są wykorzystywane w definicji indeksu jako albo klucz lub nie-kolumnklucz (dołączone).

    Aby uzyskać więcej informacji, zobacz Wykonywanie operacji indeks w trybie Online.

  • ALLOW_ROW_LOCKS = { na | OFF}
    Określa, czy wiersz blokady są dozwolone.Domyślnie jest włączone.

    • NA
      Blokady wiersza są dozwolone podczas uzyskiwania dostępu do indeksu.Aparat baz danych Określa, kiedy są używane wiersza blokad.

    • WYŁĄCZANIE
      Wiersz blokady nie są używane.

  • ALLOW_PAGE_LOCKS = { na | OFF}
    Określa, czy dozwolone są strona blokad.Domyślnie jest włączone.

    • NA
      Blokady strony są dozwolone podczas uzyskiwania dostępu do indeksu.Aparat baz danych Określa, kiedy są używane strona blokad.

    • WYŁĄCZANIE
      Strona blokady nie są używane.

  • MAXDOP =max_degree_of_parallelism
    Zastępuje maksymalny stopień równoległości prostychopcjakonfiguracja na czas trwania operacji indeksu. MAXDOP służą do ograniczania liczby procesorów używanych w realizacji planu równoległego.Maksymalna to 64 procesorów.

    max_degree_of_parallelismmoże być:

    • 1
      Pomija generowanie planu równoległego.

    • >1
      Ogranicza maksymalną liczbę procesorów używanych w operacji indeksu równolegle do określonej liczby lub mniej oparte na bieżącym obciążenia systemu.

    • 0 (domyślnie)
      Używa rzeczywista liczba procesorów lub mniej oparte na bieżącym obciążenia systemu.

    Aby uzyskać więcej informacji, zobacz Konfigurowanie operacji równoległych indeksu.

    Ostrzeżenie

    Indeksu równoległa operacje są dostępne tylko w SQL Server wersji Enterprise, Developer i oceny.

  • DATA_COMPRESSION
    Określa opcję kompresji danych dla określonego indeksu, numer partycji lub zakres partycji.Dostępne są następujące opcje:

    • BRAK
      Indeks lub określonej partycji nie są kompresowane.

    • WIERSZ
      Indeks lub określone partycje są kompresowane przy użyciu kompresji wierszy.

    • STRONY
      Indeks lub określone partycje są kompresowane przy użyciu kompresji strona .

    Aby uzyskać więcej informacji dotyczących kompresji, zobacz Tworzenie skompresowanego tabel i indeksów.

  • NA PARTYCJACH () { <partition_number_expression> | <zakres>} ,...n )
    Określa partycje, do których stosuje się ustawienie DATA_COMPRESSION.Jeśli indeks nie jest podzielony na partycje, argument na PARTYCJE spowoduje wystąpienie błędu.Jeśli na PARTYCJI klauzula nie zostanie podana, opcja DATA_COMPRESSION stosuje się do wszystkich partycji indeks partycjonowany.

    <partition_number_expression> można określić w następujący sposób:

    • Podaj numer partycji, na przykład: NA PARTYCJACH (2).

    • Zapewniają kilka poszczególnych partycji rozdzielonych przecinkami, na przykład numery partycji: NA PARTYCJACH (1, 5).

    • Na przykład podać zakresy i poszczególnych partycji: NA PARTYCJACH (2, 4, 6-8).

    <zakres> może być określona jako liczby partycji, oddzielając wyraz, na przykład: NA PARTYCJACH (6-8).

    Aby zestaw różne typy kompresji danych na różnych partycjach określ opcję DATA_COMPRESSION więcej niż jeden raz, na przykład:

    REBUILD WITH 
    (
    DATA_COMPRESSION = NONE ON PARTITIONS (1), 
    DATA_COMPRESSION = ROW ON PARTITIONS (2, 4, 6 TO 8), 
    DATA_COMPRESSION = PAGE ON PARTITIONS (3, 5)
    )
    

Uwagi

Podobnie jak inne kwerendy jest zoptymalizowany instrukcja CREATE INDEX.Aby zapisać na operacje We/Wy, procesor kwerend może wybrać skanowanie innego indeksu, zamiast przeprowadzania skanowania tabela .W niektórych sytuacjach może być wyeliminowana operacji sortowania.Na komputerach wieloprocesorowych, które są uruchomione SQL Server 2005 Enterprise Edition lub SQL Server 2008, CREATE INDEX można użyć więcej procesorów do skanowania i sortowania operacje związane z tworzeniem indeksu w taki sam sposób jak inne wykonania kwerendy.Aby uzyskać więcej informacji, zobacz Konfigurowanie operacji równoległych indeksu.

Operacja tworzenia indeksu może być minimalny zalogowany, jeśli modelu odzyskiwanie bazy danych jest zestaw na bulk-logged lub proste.Aby uzyskać więcej informacji, zobacz Wybieranie modelu odzyskiwania dla operacji indeksu.

Indeksy mogą być tworzone na tymczasowej tabela.Po przerwaniu tabela lub następuje zakończenie sesja , indeksy są usuwane.

Indeksy obsługują właociwooci rozszerzonych.Aby uzyskać więcej informacji, zobacz Używanie rozszerzonych właociwooci obiektów bazy danych.

Stosowanie indeksów klastrowanych

Tworzenie indeks klastrowany w tabela (sterty) lub upuszczanie i odtwarzania istniejący indeks klastrowany wymaga dodatkowego obszaru roboczego mają być dostępne w bazie danych sortowanie i tymczasową kopię oryginalnej tabela lub istniejące dane indeks klastrowany .Aby uzyskać więcej informacji, zobacz Określanie wymagań dotyczących miejsca na dysku indeksu.Aby uzyskać więcej informacji na temat indeksów klastrowanych, zobacz Tworzenie indeksów klastrowanych.

Indeksy unikatowe

Gdy istnieje indeks unikatowy Aparat baz danych sprawdza, czy zduplikowane wartości, które każdy danych czas jest dodawana przez operacji wstawiania.Operacje wstawiania, generujących wartości zduplikowanych klucz są przywracane oraz Aparat baz danych wyświetla komunikat o błędzie.Ta zasada obowiązuje, nawet jeśli operację wstawiania zmienia wiele wierszy, ale powoduje, że tylko jeden zduplikowany.Jeśli próby wprowadzania danych, dla których istnieje indeks unikatowy i IGNORE_DUP_KEY klauzula jest zestaw na, tylko wiersze naruszenie UNIKATOWEGO indeksu nie powiedzie się.Aby uzyskać więcej informacji na temat unikatowe indeksy, zobacz Tworzenie indeksów unikatowych.

Indeksy podzielonym na partycje

Indeksy podzielonym na partycje są tworzone i utrzymywane w sposób podobny do tabel podzielonym na partycje, ale podobnie jak zwykłe indeksy są obsługiwane jako osobne obiekty.Masz indeks partycjonowany dla tabela , która nie podzielony na partycje i masz nonpartitioned indeksu na tabela , który jest podzielony na partycje.

Jeśli tworzysz indeks tabela partycjonowanai nie zostanie określona grupa plików , na którym ma być umieszczony indeks indeks jest podzielony na partycje w taki sam sposób jak tabelapodstawowej.Jest to spowodowane indeksy, domyślnie są umieszczane na tym samym aplikacjami jako ich tabel podstawowych i tabela partycjonowana tego samego schemat partycji , która używa tego samego partycjonowanie kolumn.

Gdy nieunikatowy partycjonowanie , indeks klastrowany Aparat baz danych domyślnie dodaje wszystkie partycjonowanie kolumny do listy kluczy indeks klastrowany , jeśli jeszcze nie został określony.

Widoki indeksowane mogą być tworzone na tabelach podzielonym na partycje w taki sam sposób jak indeksy tabel.Aby uzyskać więcej informacji na temat indeksów podzielonym na partycje, zobacz Podzielonym na partycje tabel i indeksów.

Widoki indeksowane

Tworzenie unikatowego indeks klastrowany w widoku zwiększa wydajność kwerendy, ponieważ widok jest przechowywany w bazie danych w taki sam sposób, który znajduje się tabela z indeks klastrowany .optymalizator kwerendy może przyspieszyć wykonywanie kwerend za pomocą widoków indeksowanych.Widok nie ma odwoływać się w kwerendzie Optymalizator uwzględnienie tego widoku do podstawiania.

Następujące kroki są wymagane do utworzenia indeksowany widok są krytyczne dla pomyślnego wdrożenia widoku:

  1. Sprawdź, czy USTAWIĆ opcje są prawidłowe dla wszystkich istniejących tabel, które będą odwoływać się w widoku.

  2. Sprawdź, czy Ustawianie opcji dla sesja są zestaw poprawnie przed utworzeniem nowych tabel i widok.

  3. Sprawdź, czy definicja widoku jest firmy Deterministic Networks.

  4. Tworzenie widoku za pomocą opcji Z SCHEMABINDING.

  5. Tworzenie unikatowego indeks klastrowany w widoku.

Ustawianie opcji wymagane Widoki indeksowane

Ocena tego samego wyrażenie może wygenerować różne wyniki w Aparat baz danych Jeśli USTAWIĆ różne opcje są aktywne podczas kwerendy jest wykonywany.Na przykład po opcji SET CONCAT_NULL_YIELDS_NULL jest zestaw na wyrażenie 'abc' + NULL zwraca wartość NULL.Jednak po CONCAT_NULL_YIEDS_NULL jest zestaw na wyłączone, tym samym wyrażenie daje 'abc'.

Aby upewnić się, że widoki można obsługiwać poprawnie i zwraca spójne wyniki, widoki indeksowane wymaga kilka opcji zestaw ustalonych wartości.Ustawianie opcji w poniższej tabela muszą być zestaw na wartości podane w wymaganewartość kolumna w każdym przypadku, gdy są następujące warunki:

  • Tworzony jest indeksowany widok .

  • Nie ma żadnych Wstaw, zaktualizować lub usunąć operacje wykonywane na dowolnej tabela w indeksowany widok.Obejmuje to operacje takie jak kopiowanie masowe, replikacjai kwerendami rozproszonymi.

  • indeksowany widok jest używana przez optymalizator kwerendy do utworzenia planu kwerend.

    Ustawianie opcji

    Wymagana wartość

    Wartość domyślna na serwerze

    Default

    Wartość OLE DB i ODBC

    Default

    DB-wartość biblioteki

    KLAUZULE ANSI_NULLS

    NA

    NA

    NA

    WYŁĄCZANIE

    SPOWODOWAŁYBY

    NA

    NA

    NA

    WYŁĄCZANIE

    ANSI_WARNINGS *

    NA

    NA

    NA

    WYŁĄCZANIE

    ARITHABORT

    NA

    NA

    WYŁĄCZANIE

    WYŁĄCZANIE

    CONCAT_NULL_YIELDS_NULL

    NA

    NA

    NA

    WYŁĄCZANIE

    NUMERIC_ROUNDABORT

    WYŁĄCZANIE

    WYŁĄCZANIE

    WYŁĄCZANIE

    WYŁĄCZANIE

    QUOTED_IDENTIFIER

    NA

    NA

    NA

    WYŁĄCZANIE

    * Ustawienie ANSI_WARNINGS ON niejawnie ustawia ARITHABORT on, gdy zgodność bazy danych poziom jest zestaw 90 lub wyższej.Jeśli zgodności bazy danych poziom jest zestaw 80 lub wcześniej, opcja ARITHABORT musi być jawnie zestaw na.

Jeśli używasz połączenia serwera OLE DB lub ODBC jedyną wartością, którą należy zmodyfikować jest ustawienie ARITHABORT.Wszystkie DB-Biblioteka wartości muszą być zestaw poprawnie na poziom serwera za pomocą sp_configure lub z aplikacji za pomocą polecenia SET.Aby uzyskać więcej informacji na temat zestawu opcji, zobacz W programie SQL Server przy użyciu opcji.

Ważna informacjaWażne:

Zdecydowanie zaleca się że opcja użytkownika ARITHABORT należy zestaw całego serwera on zaraz po pierwszym indeksowany widok lub indeksu dla kolumna obliczanej jest tworzony w dowolnej bazy danych na serwerze.

Funkcje firmy Deterministic Networks

Definicja indeksowany widok musi być deterministyczny.Widok jest przewidywalne, jeżeli wszystkie wyrażenia na liście wybierz jak również WHERE i Grupuj według klauzule są przewidywalne.Wszelkie czas są oceniane z określonego zestaw wartości wejściowych deterministyczny wyrażenia zawsze zwraca ten sam wynik.Tylko firma deterministic funkcje mogą uczestniczyć w deterministyczny wyrażenia.Na przykład funkcja DATEADD jest firmy Deterministic Networks, ponieważ zawsze zwraca ten sam wynik dla dowolnego danego zestaw wartości argumentu trzy parametry.GETDATE jest firmy Deterministic Networks, ponieważ zawsze jest wywoływane z tej samej argumentu, ale wartość zwraca zmiany czas jest wykonywany.Aby uzyskać więcej informacji, zobacz Przewidywalne i rodzaju funkcje.

Nawet jeśli wyrażenie jest firmy Deterministic Networks, jeżeli zawiera on wyrażenia pływak dokładny wynik może zależeć od architektury procesora lub wersja mikrokodu.Aby zapewnić integralność danychtakich wyrażeń mogą uczestniczyć tylko jako nie - widoków indeksów kolumnklucz .Deterministyczny wyrażenia, które nie zawierają wyrażenia pływak nazywane są dokładne.Dokładne deterministyczny wyrażenia mogą uczestniczyć w kolumnach klucz i gdzie lub klauzul Grupuj według Widoki indeksowane.

Użycie IsDeterministic właściwość COLUMNPROPERTY funkcja czy widok kolumna jest firmy Deterministic Networks.Użycie IsPrecise właściwość COLUMNPROPERTY funkcja określić dokładne firmy Deterministic Networks kolumna w widoku z powiązanie schematu.COLUMNPROPERTY zwraca wartość 1, jeśli ma wartość TRUE, 0, jeśli ma wartość FAŁSZ i wartości NULL dla danych wejściowych, który jest nieprawidłowy.Oznacza to, że kolumna nie jest firmy Deterministic Networks lub nie dokładne.

Dodatkowe wymagania

Oprócz określenia opcji i wymagania firmy Deterministic Networks funkcja muszą być spełnione następujące wymagania:

  • Użytkownik, który wykonuje tworzenie INDEKSU musi być właściciela widoku.

  • Jeśli definicja widoku zawiera Grupuj według klauzula, klucz unikatowy indeks klastrowany można odwoływać się tylko kolumny określone w grupy według klauzula.

  • Tabele bazowe muszą mieć prawidłowe Ustaw opcje, które zestaw na czas utworzenia tabela lub go nie może odwoływać się widok z powiązanieschematu.

  • Tabele musi odwoływać się dwóch części nazwy schema**.**tablename, w definicji widoku.

  • Funkcje zdefiniowane przez użytkownika muszą być tworzone przy użyciu opcji Z SCHEMABINDING.

  • Funkcje zdefiniowane przez użytkownika musi odwoływać się dwóch części nazwy schema**.**function.

  • Widok muszą być tworzone przy użyciu opcji Z SCHEMABINDING.

  • Widok musi odwoływać się tylko tabele bazowe w tej samej bazie danych, nie w innych widokach.

  • Definicja widoku nie może zawierać:

    COUNT(*)

    Zestaw wierszy, funkcja

    Pochodne tabela

    samosprzężenie

    DISTINCT

    AVG STDEV ODCHYLENIE,

    float*, text, ntext, or image columns

    Podkwerendy

    Predykaty pełnego tekstu (zawierające, FREETEXT)

    Suma na nullable wyrażenie

    Środowisko CLR zdefiniowane przez użytkownika wartość zagregowana funkcja

    U GÓRY

    MIN MAKS

    UNIA

    * indeksowany widok może zawierać float kolumny; jednak takich kolumn nie zawarte w indeks klastrowany klucz.

Jeżeli Grupuj według, definicja WIDOKU musi zawierać COUNT_BIG(*) i nie może zawierać HAVING.Ograniczenia grupy przez te mają zastosowanie jedynie do definicji indeksowany widok .Kwerendę można używać indeksowany widok w jego plan wykonania, nawet jeśli nie spełniają tych ograniczeń Grupuj według.

W tabela partycjonowanamożna utworzyć widoki indeksowane i mogą same być podzielone na partycje.Aby uzyskać więcej informacji dotyczących partycjonowaniezobacz poprzednią sekcję "Indeksów na partycje".

Aby zapobiec Aparat baz danych z pomocą Widoki indeksowane zawierają wskazówki OPTION (rozwinąć WIDOKI) na kwerendę.Ponadto jeżeli którykolwiek z wyświetlonych opcji niepoprawnie zestaw, uniemożliwi Optymalizator przy użyciu indeksy w widokach.Aby uzyskać więcej informacji na temat Wskazówki OPTION (rozwinąć WIDOKI) zobacz SELECT (Transact-SQL).

poziom zgodności bazy danych nie może być mniejsza niż 80.Nie można zmienić bazę danych zawierającą indeksowany widok zgodności poziom niższy niż 80.

Filtrowane indeksów

Filtrowane indeks jest zoptymalizowanym indeks nieklastrowany, dopasowane do kwerend, które wybrać niewielki procent wierszy z tabela.Predykat filtru wykorzystuje do indeksowania część danych w tabela.Dobrze indeks filtrowanego można poprawić wydajność kwerendy, zmniejszyć koszty składowania i zmniejszyć koszty eksploatacji.

Wymagane Ustaw opcje dla filtrowanych indeksów

ZESTAW opcji w Required Value kolumna są wymagane, ilekroć wystąpi którykolwiek z następujących warunków:

  • Utwórz indeks filtrowane.

  • INSERT, UPDATE, DELETE lub operacji scalania modyfikuje danych w indeksie filtrowane.

  • optymalizator kwerendy używa indeksu filtrowane plan wykonania kwerend.

    Ustawianie opcji

    Wymagana wartość

    KLAUZULE ANSI_NULLS

    NA

    SPOWODOWAŁYBY

    NA

    ANSI_WARNINGS *

    NA

    ARITHABORT

    NA

    CONCAT_NULL_YIELDS_NULL

    NA

    NUMERIC_ROUNDABORT

    WYŁĄCZANIE

    QUOTED_IDENTIFIER

    NA

    * Ustawienie ANSI_WARNINGS ON niejawnie ustawia ARITHABORT on, gdy zgodność bazy danych poziom jest zestaw 90 lub wyższej.Jeśli zgodności bazy danych poziom jest zestaw 80 lub wcześniej, opcja ARITHABORT musi być jawnie zestaw na.

Jeśli Ustawianie opcji są niepoprawne, mogą wystąpić następujące warunki:

  • Filtrowane indeks nie jest tworzony.

  • Aparat baz danych Generuje błąd i wycofuje instrukcji INSERT, UPDATE, DELETE lub korespondencji seryjnej, które zmiany danych w indeksie.

  • Optymalizator kwerend nie traktuje indeksu w plan wykonania dla wszelkich instrukcji języka Transact -SQL .

Aby uzyskać więcej informacji dotyczących filtrowania indeksy, zobacz Filtrowane wskazówek indeksu.

Indeksy przestrzenne

Indeksy XML

Dla informacji na temat formatu XML indeksy, zobacz Tworzenie INDEKSU XML (Transact-SQL) i Indeksy na kolumnach typu danych XML.

Rozmiar klucza indeksu

Maksymalny rozmiar indeksu klucz jest 900 bajtów.Indeksy na varchar kolumny, które może przekraczać 900 bajtów mogą być tworzone, jeśli istniejące dane w kolumnach nie przekraczać 900 bajtów w czas utworzenia indeksu; jednak kolejne insert lub update actions w kolumnach, które powodują całkowity rozmiar powinien być większy niż 900 bajtów zakończy się niepowodzeniem.Aby uzyskać więcej informacji, zobacz Maksymalny rozmiar indeksu kluczy.Indeks klucz indeks klastrowany nie może zawierać varchar kolumny, które mają istniejące dane w ROW_OVERFLOW_DATA jednostka alokacji.Jeśli tworzony jest indeks klastrowany na varcharistniejące dane ikolumna znajduje jednostka alokacjiIN_ROW_DATA, Wstaw kolejnych lub operacje aktualizacji na kolumna , czy wypychanie błędów zostaną wyłączone wiersz danych. Aby uzyskać więcej informacji na temat jednostek alokacji, zobacz Organizacji indeksu i tabeli.

Zbudowania indeksów nie klastrowanych może zawierać inne niż-kolumnklucz w liść poziom indeksu.Te kolumny nie są uważane przez Aparat baz danych podczas obliczania rozmiaru klucz indeksu.Aby uzyskać więcej informacji, zobacz Indeks z uwzględnionych kolumn.

Kolumny obliczane

Indeksy mogą być tworzone na kolumny obliczane.Ponadto obliczanej kolumny może mieć właściwość PERSISTED.Oznacza to, że Aparat baz danych przechowuje obliczonych wartości w tabelai aktualizuje je po zaktualizowaniu innych kolumn, od których zależy kolumna obliczanej.Aparat baz danych Używa tych wartości trwałe tworzy indeks oparty na kolumnai indeks istnieje odwołanie w kwerendzie.

Indeksowanie kolumnaobliczanej, obliczanej kolumna musi przewidywalne i dokładne.Jednak przy użyciu PERSISTED właściwość rozwija typu Indeksowalny kolumny obliczanej obejmują:

  • Obliczona na podstawie kolumn Transact-SQL i funkcje środowiska CLR i metod zdefiniowany przez użytkownika typ CLR , które są oznaczone deterministyczny przez użytkownika.

  • Obliczane kolumny oparte na wyrażeniach, które są przewidywalne, zgodnie z definicją Aparat baz danych ale niedokładny.

Kolumny obliczane utrwalonej wymagają zestaw opcji jest zestaw zgodnie z poprzedniej sekcji "Wymagany USTAWIĆ opcje dla widoków indeksowanych".

Ograniczenie klucza podstawowego i może zawierać kolumna obliczanej, jak długo spełnia wszystkie warunki dla indeksowania.W szczególności obliczanej kolumna musi być deterministyczny i dokładne lub przewidywalne i trwałe.Aby uzyskać więcej informacji o determinism, zobacz Przewidywalne i rodzaju funkcje.

Obliczane kolumny pochodzące z image, ntext, text, varchar(max), nvarchar(max), varbinary(max), i xml typy danych mogą być indeksowane, albo jako klucz lub innych niż uwzględnione-kluczkolumna tak długo, jak typ danych kolumna obliczanej jest dopuszczalne jako kluczindeksukolumna lub innych niż-kluczkolumna. Na przykład, nie można utworzyć indeksu głównego XML na obliczanych xml kolumna.Jeśli rozmiar indeksu klucz przekracza 900 bajtów, wyświetlany jest komunikat ostrzegawczy.

Tworzenie indeksu dla kolumna obliczanej może spowodować awarię insert lub aktualizowanie operacji, która wcześniej pracował.Takiej awarii może podjąć jeżeli obliczanej kolumna wyniki błędów arytmetycznych.Na przykład w poniższej tabelachociaż obliczane kolumnacwyniki arytmetycznych błąd INSERTdziałainstrukcja .

CREATE TABLE t1 (a int, b int, c AS a/b);
INSERT INTO t1 VALUES (1, 0);

Jeśli po utworzeniu tabela, można natomiast utworzyć indeks w kolumnaobliczanejc, tym samym INSERTinstrukcja będzie teraz zakończą się niepowodzeniem.

CREATE TABLE t1 (a int, b int, c AS a/b);
CREATE UNIQUE CLUSTERED INDEX Idx1 ON t1(c);
INSERT INTO t1 VALUES (1, 0);

Aby uzyskać więcej informacji, zobacz Tworzenie indeksów kolumny obliczanej.

Kolumny zawarte w indeksach

Non - kolumnklucz , nazywane uwzględnionych kolumn, można dodać do liść poziom indeks nieklastrowany aby poprawić wydajność kwerendy przez obejmujących kwerendy.Oznacza to, że wszystkie kolumny w kwerendzie są uwzględniane w indeksie jako albo klucz lub nie-kolumnklucz .Dzięki temu optymalizator kwerendy znaleźć wymaganych informacji z skanowanie indeksu; dane tabela lub indeks klastrowany nie jest dostępny.Aby uzyskać więcej informacji, zobacz Indeks z uwzględnionych kolumn.

Określanie opcji indeksu

SQL Server 2005wprowadzonego nowy indeks opcji, a także modyfikuje sposób określono opcje.W tył Składnia zgodna z option_name jest równoważne z ()<option_name > = na ). Kiedy można zestaw opcje indeksu, obowiązują następujące reguły:

  • Nowe opcje indeks może być określony tylko przy użyciu z (option_name)= ON | OFF**)**.

  • Nie można określić opcje przy użyciu zarówno do tyłu Składnia zgodna i nowych w tej samej instrukcja.Na przykład, określenie z ()DROP_EXISTING**,** ONLINE = na**)** powoduje, że instrukcja nie powiedzie się.

  • Podczas tworzenia indeksu XML opcje musi być określona przy użyciu z (option_name)= ON | OFF**)**.

Klauzula DROP_EXISTING

DROP_EXISTING klauzula można użyć, aby odbudować indeks, dodawanie lub usuwanie kolumn, modyfikowanie opcji, zmodyfikować kolumna kolejność sortowanialub zmienić schemat partycji lub grupa plików.

Jeśli indeks wymusza ograniczenie na klucz podstawowy lub unikatowe i definicji indeksu nie ulega zmianie w jakikolwiek sposób, indeks jest usuwany, a utworzony ponownie, zachowując istniejące ograniczenia.Jednak jeśli zmieniona definicja indeksu nie działa instrukcja .Aby zmienić definicję klucza podstawowego ani ograniczenia UNIQUE, drop constraint i dodać ograniczenia z nową definicję.

DROP_EXISTING zwiększa wydajność podczas odtwarzania indeks klastrowanyz albo tych samych lub różnych zestaw kluczy na tabela zawierającej zbudowania indeksów nie klastrowanych.DROP_EXISTING zastępuje wykonanie UPUŚĆ INDEX instrukcja na stary indeks klastrowany następuje wykonanie instrukcja CREATE INDEX dla nowego indeks klastrowany.Odbudowa zbudowania indeksów raz, a następnie tylko wtedy, gdy została zmieniona definicja indeksu.DROP_EXISTING klauzula odbudować zbudowania indeksów nie, gdy definicja indeksu ma tej samej nazwy indeksu, klucz i kolumny partycji, unikatowości atrybuti kolejność sortowania , jak oryginalny indeks.

Czy zbudowania indeksów odbudowa lub nie, one zawsze pozostają w ich oryginalnym aplikacjami lub partycji systemów i używać oryginalnej funkcji partycji.Odbudowaniu indeks klastrowany do innej grupa plików lub schemat partycjizbudowania indeksów nie są przenoszone do zbiega się z nową lokalizację indeks klastrowany.Dlatego nawet zbudowania indeksów wcześniej wyrównane z indeks klastrowany, nie mogą być dostosowane z nim.Aby uzyskać więcej informacji na temat indeks partycjonowany wyrównaniezobacz Specjalne wytyczne dla indeksów podzielonym na partycje.

DROP_EXISTING klauzula nie sortowania danych ponownie, gdy używane są te same kolumny klucz indeksu w tej samej kolejności i z tego samego rosnąco lub malejąco, chyba że index instrukcja Określa indeks nieklastrowany i opcja ONLINE jest zestaw na wyłączone.Wyłączenie indeks klastrowany można wykonać operacji tworzenia INDEKSU Z DROP_EXISTING, z ONLINE zestaw na OFF.indeks nieklastrowany jest wyłączony, nie jest skojarzony z wyłączonego indeks klastrowanymożna wykonać operacji tworzenia INDEKSU Z DROP_EXISTING z ONLINE zestaw na wyłączone lub dalej.

Porzucone lub przebudowanych, indeksy z zakresów 128 lub więcej Aparat baz danych podporządkowuje deallocations rzeczywista strona i ich skojarzone blokady, aż po zatwierdzenia transakcji.Aby uzyskać więcej informacji, zobacz Upuszczanie i odbudowując dużych obiektów.

Opcja ONLINE

Stosuje się następujące wytyczne do wykonywania operacji indeksu w trybie online:

  • Nie mogą zmieniać, obcięta i usunięte podczas procesu operacja online indeksu tabela podstawowej.

  • Dodatkowe tymczasowego miejsca na dysku jest wymagane podczas operacji indeksu.Aby uzyskać więcej informacji, zobacz Określanie wymagań dotyczących miejsca na dysku indeksu.

  • Operacje online mogą być wykonywane na indeksy podzielonym na partycje i indeksy, które zawierają utrwalone kolumny obliczane lub dołączone kolumny.

Aby uzyskać więcej informacji, zobacz Wykonywanie operacji indeks w trybie Online.

Wiersz i opcje blokady strony

Gdy ALLOW_ROW_LOCKS = ON i ALLOW_PAGE_LOCK = ON wiersz, strona-, i tabela-poziom blokady są dozwolone podczas uzyskiwania dostępu do indeksu.Aparat baz danych Wybiera odpowiedni blokada i może eskalować blokada z rzędu lub stronablokada tabelablokada. Aby uzyskać więcej informacji, zobacz Eskalację blokady (aparat bazy danych).

Gdy ALLOW_ROW_LOCKS = OFF i ALLOW_PAGE_LOCK = OFF tylko tabela-poziom blokada jest dozwolone podczas uzyskiwania dostępu do indeksu.

Aby uzyskać więcej informacji o konfigurowaniu blokowania ziarnistość indeksu, zobacz Dostosowywanie blokowania indeksu.

Wyświetlanie informacji o indeksie

Aby przywrócić informacje o indeksach, można użyć widoki wykazu, funkcje systemowei procedury składowane w systemie.Aby uzyskać więcej informacji, zobacz Wyświetlanie informacji o indeksie.

Kompresja danych

Kompresja danych jest opisany w temacie Tworzenie skompresowanego tabel i indeksów.Dostępne są następujące punkty klucz , należy rozważyć:

  • Kompresji można zezwolić na więcej wierszy, które mają być przechowywane na strona, ale nie zmienia maksymalny rozmiar wiersza.

  • Inne niżliść stron indeksu nie są strona skompresowane, ale mogą być skompresowane wiersza.

  • Każdy indeks nieklastrowany ma ustawienie kompresji i nie dziedziczy ustawienie kompresji w tabelapodstawowej.

  • Podczas tworzenia indeks klastrowany na sterty indeks klastrowany dziedziczy stanu kompresji sterty o ile nie określono stanu alternatywnych kompresji.

Indeksów podzielonym na partycje, obowiązują następujące ograniczenia:

  • Nie można zmienić kompresja ustawienie jedną partycję, gdy tabela zawiera indeksy nonaligned.

  • Indeks ZMIENIA <indeksu> ...ODBUDUJ PARTYCJI...Składnia przebudowuje określonej partycji indeksu.

  • Indeks ZMIENIA <indeksu> ...ODBUDUJ Z...Składnia buduje ponownie wszystkich partycji indeksu.

Aby ocenić, jak zmiana stanu kompresji będą wpływać na tabela, indeks lub partycji, należy użyć sp_estimate_data_compression_savings procedura składowana.

Uprawnienia

Wymaga ZMIEŃ uprawnienia w tabela lub widoku.Użytkownik musi być element członkowski sysadmin stała rola serwera lub db_ddladmin i db_owner ról stałej bazy danych.

Przykłady

A.Tworzenie prostych indeks nieklastrowany

Poniższy przykład tworzy indeks nieklastrowany na BusinessEntityID kolumna Purchasing.ProductVendor tabela.

USE AdventureWorks2008R2;
GO
IF EXISTS (SELECT name FROM sys.indexes
            WHERE name = N'IX_ProductVendor_VendorID')
    DROP INDEX IX_ProductVendor_VendorID ON Purchasing.ProductVendor;
GO
CREATE INDEX IX_ProductVendor_VendorID 
    ON Purchasing.ProductVendor (BusinessEntityID); 
GO

B.Tworzenie prostych nieklastrowany indeks złożony

Poniższy przykład tworzy nieklastrowany indeks złożony na SalesQuota i SalesYTD kolumny Sales.SalesPerson tabela.

USE AdventureWorks2008R2
GO
IF EXISTS (SELECT name FROM sys.indexes
            WHERE name = N'IX_SalesPerson_SalesQuota_SalesYTD')
    DROP INDEX IX_SalesPerson_SalesQuota_SalesYTD ON Sales.SalesPerson ;
GO
CREATE NONCLUSTERED INDEX IX_SalesPerson_SalesQuota_SalesYTD
    ON Sales.SalesPerson (SalesQuota, SalesYTD);
GO

C.Tworzenie unikatowego indeks nieklastrowany

Poniższy przykład tworzy unikatowy indeks nieklastrowany na Name kolumna Production.UnitMeasure tabela.Indeks będzie wymuszać unikatowość danych wstawione do Name kolumna.

USE AdventureWorks2008R2;
GO
IF EXISTS (SELECT name from sys.indexes
             WHERE name = N'AK_UnitMeasure_Name')
    DROP INDEX AK_UnitMeasure_Name ON Production.UnitMeasure;
GO
CREATE UNIQUE INDEX AK_UnitMeasure_Name 
    ON Production.UnitMeasure(Name);
GO

Następująca kwerenda badań ograniczenie unikatowości przez próbujesz wstawić wiersz z taką samą wartość jak w istniejącym wierszu.

--Verify the existing value.
SELECT Name FROM Production.UnitMeasure WHERE Name = N'Ounces';
GO
INSERT INTO Production.UnitMeasure (UnitMeasureCode, Name, ModifiedDate)
    VALUES ('OC', 'Ounces', GetDate());

Wynikowy komunikat o błędzie jest:

Server: Msg 2601, Level 14, State 1, Line 1

Cannot insert duplicate key row in object 'UnitMeasure' with unique index 'AK_UnitMeasure_Name'. The statement has been terminated.

D.Za pomocą opcji IGNORE_DUP_KEY

Poniższy przykład ilustruje skutki IGNORE_DUP_KEY opcji przez wstawianie wielu wierszy do tabela tymczasowej najpierw z opcji zestaw ON i ponownie z opcji zestaw OFF.Pojedynczy wiersz zostanie wstawiony #Testtabela spowoduje celowo zduplikowana wartość podczas drugiego wiersza wielu INSERTwykonaniuinstrukcja . Liczba wierszy w tabela zwraca liczbę wiersze wstawione.

USE AdventureWorks2008R2;
GO
CREATE TABLE #Test (C1 nvarchar(10), C2 nvarchar(50), C3 datetime);
GO
CREATE UNIQUE INDEX AK_Index ON #Test (C2)
    WITH (IGNORE_DUP_KEY = ON);
GO
INSERT INTO #Test VALUES (N'OC', N'Ounces', GETDATE());
INSERT INTO #Test SELECT * FROM Production.UnitMeasure;
GO
SELECT COUNT(*)AS [Number of rows] FROM #Test;
GO
DROP TABLE #Test;
GO

Poniżej przedstawiono wyniki drugiego INSERT instrukcja.

Server: Msg 3604, Level 16, State 1, Line 5 Duplicate key was ignored.

Number of rows

--------------

38

Należy zauważyć, że wiersze wstawione z Production.UnitMeasure tabela , która nie naruszają ograniczenia unikatowości zostały pomyślnie wstawione.Ostrzeżenie zostało wydane i zduplikowany wiersz ignorowane, ale cała transakcja została nie wycofana.

Te same instrukcje wykonywane są ponownie, ale z IGNORE_DUP_KEY zestaw na OFF.

USE AdventureWorks2008R2;
GO
CREATE TABLE #Test (C1 nvarchar(10), C2 nvarchar(50), C3 datetime);
GO
CREATE UNIQUE INDEX AK_Index ON #Test (C2)
    WITH (IGNORE_DUP_KEY = OFF);
GO
INSERT INTO #Test VALUES (N'OC', N'Ounces', GETDATE());
INSERT INTO #Test SELECT * FROM Production.UnitMeasure;
GO
SELECT COUNT(*)AS [Number of rows] FROM #Test;
GO
DROP TABLE #Test;
GO

Poniżej przedstawiono wyniki drugiego INSERT instrukcja.

Server: Msg 2601, Level 14, State 1, Line 5

Cannot insert duplicate key row in object '#Test' with unique index

'AK_Index'. The statement has been terminated.

Number of rows

--------------

1

Obwieszczenie Brak wierszy z Production.UnitMeasure tabela zostały wstawione do tabela , nawet jeśli tylko jeden wiersz w tabela naruszone UNIQUE ograniczenie indeksu.

E.Aby usunąć i ponownie utwórz indeks przy użyciu DROP_EXISTING

W poniższym przykładzie spadnie i odtwarza istniejący indeks na ProductID kolumna Production.WorkOrder tabela za pomocą DROP_EXISTING opcji.Opcje FILLFACTOR i PAD_INDEX są również zestaw.

USE AdventureWorks2008R2;
GO
CREATE NONCLUSTERED INDEX IX_WorkOrder_ProductID
    ON Production.WorkOrder(ProductID)
    WITH (FILLFACTOR = 80,
        PAD_INDEX = ON,
        DROP_EXISTING = ON);
GO

F.Tworzenie indeksu w widoku

Poniższy przykład tworzy widok i indeks tego widoku.Znajdują się dwie kwerendy, użyj indeksowany widok.

USE AdventureWorks2008R2;
GO
--Set the options to support indexed views.
SET NUMERIC_ROUNDABORT OFF;
SET ANSI_PADDING, ANSI_WARNINGS, CONCAT_NULL_YIELDS_NULL, ARITHABORT,
    QUOTED_IDENTIFIER, ANSI_NULLS ON;
GO
--Create view with schemabinding.
IF OBJECT_ID ('Sales.vOrders', 'view') IS NOT NULL
DROP VIEW Sales.vOrders ;
GO
CREATE VIEW Sales.vOrders
WITH SCHEMABINDING
AS
    SELECT SUM(UnitPrice*OrderQty*(1.00-UnitPriceDiscount)) AS Revenue,
        OrderDate, ProductID, COUNT_BIG(*) AS COUNT
    FROM Sales.SalesOrderDetail AS od, Sales.SalesOrderHeader AS o
    WHERE od.SalesOrderID = o.SalesOrderID
    GROUP BY OrderDate, ProductID;
GO
--Create an index on the view.
CREATE UNIQUE CLUSTERED INDEX IDX_V1 
    ON Sales.vOrders (OrderDate, ProductID);
GO
--This query can use the indexed view even though the view is 
--not specified in the FROM clause.
SELECT SUM(UnitPrice*OrderQty*(1.00-UnitPriceDiscount)) AS Rev, 
    OrderDate, ProductID
FROM Sales.SalesOrderDetail AS od
    JOIN Sales.SalesOrderHeader AS o ON od.SalesOrderID=o.SalesOrderID
        AND ProductID BETWEEN 700 and 800
        AND OrderDate >= CONVERT(datetime,'05/01/2002',101)
GROUP BY OrderDate, ProductID
ORDER BY Rev DESC;
GO
--This query can use the above indexed view.
SELECT  OrderDate, SUM(UnitPrice*OrderQty*(1.00-UnitPriceDiscount)) AS Rev
FROM Sales.SalesOrderDetail AS od
    JOIN Sales.SalesOrderHeader AS o ON od.SalesOrderID=o.SalesOrderID
        AND DATEPART(mm,OrderDate)= 3
        AND DATEPART(yy,OrderDate) = 2002
GROUP BY OrderDate
ORDER BY OrderDate ASC;
GO

G.Tworzenie indeksu z uwzględnione (innych niż-klucz) kolumn

Poniższy przykład tworzy indeks nieklastrowany z jednego klucz kolumna (PostalCode) i cztery inne niż-kolumnklucz (AddressLine1, AddressLine2, City, StateProvinceID).Kwerenda, która jest objęta następujące indeksu.Aby wyświetlić indeksu wybranego przez optymalizator kwerendyna kwerendy menu w SQL Server Management Studio, zaznacz Wyświetlić rzeczywiste Plan wykonania przed wykonaniem kwerendy.

USE AdventureWorks2008R2;
GO
IF EXISTS (SELECT name FROM sys.indexes
            WHERE name = N'IX_Address_PostalCode')
    DROP INDEX IX_Address_PostalCode ON Person.Address;
GO
CREATE NONCLUSTERED INDEX IX_Address_PostalCode
    ON Person.Address (PostalCode)
    INCLUDE (AddressLine1, AddressLine2, City, StateProvinceID);
GO
SELECT AddressLine1, AddressLine2, City, StateProvinceID, PostalCode
FROM Person.Address
WHERE PostalCode BETWEEN N'98000' and N'99999';
GO

H.Tworzenie indeks partycjonowany

Poniższy przykład tworzy nieklastrowany indeks partycjonowany na TransactionsPS1, istniejący schemat partycji.W tym przykładzie przyjęto, że próbki indeks partycjonowany został zainstalowany.

USE AdventureWorks2008R2;
GO
IF EXISTS (SELECT name FROM sys.indexes
    WHERE name = N'IX_TransactionHistory_ReferenceOrderID'
    AND object_id = OBJECT_ID(N'Production.TransactionHistory'))
DROP INDEX IX_TransactionHistory_ReferenceOrderID
    ON Production.TransactionHistory;
GO
CREATE NONCLUSTERED INDEX IX_TransactionHistory_ReferenceOrderID
    ON Production.TransactionHistory (ReferenceOrderID)
    ON TransactionsPS1 (TransactionDate);
GO

I.Tworzenie indeksu filtrowane

Poniższy przykład tworzy indeks filtrowane na Production.BillOfMaterials tabela.Predykat filtru można dołączyć kolumny, które nie są kolumn klucz w filtrowanym indeksu.Orzeczenie w tym przykładzie wybiera wiersze, gdzie EndDate jest NIEZEROWA.

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

J.Tworzenie indeksu skompresowanego

Poniższy przykład tworzy indeks na nonpartitioned tabela przy użyciu kompresji wierszy.

CREATE NONCLUSTERED INDEX IX_INDEX_1 
    ON T1 (C2)
WITH ( DATA_COMPRESSION = ROW ) ; 
GO

Poniższy przykład tworzy indeks na tabela partycjonowana przy użyciu kompresji wierszy na wszystkich partycjach indeksu.

CREATE CLUSTERED INDEX IX_PartTab2Col1
ON PartitionTable1 (Col1)
WITH ( DATA_COMPRESSION = ROW ) ;
GO

Poniższy przykład tworzy indeks dla tabela partycjonowana przy użyciu kompresji strona na partycji 1 kompresji indeksu i wierszy na partycjach 2 przez 4 z indeksu.

CREATE CLUSTERED INDEX IX_PartTab2Col1
ON PartitionTable1 (Col1)
WITH (DATA_COMPRESSION = PAGE ON PARTITIONS(1),
    DATA_COMPRESSION = ROW ON PARTITIONS (2 TO 4 ) ) ;
GO