CREATE INDEX (języka Transact-SQL)

Tworzy indeks relacyjnej w określonej tabela lub widoku w określonej tabela.Indeks można utworzyć, zanim dane w tabela.Relacyjne indeksy mogą być tworzone na tabel lub widoków w innej bazie danych, określając nazwę kwalifikowaną bazy danych.

Uwaga

Aby uzyskać informacje na temat tworzenia indeksu XML zobacz CREATE XML INDEX (Transact-SQL). Aby uzyskać informacje na temat tworzenia przestrzennych indeksu zobacz CREATE SPATIAL INDEX (Transact-SQL).

Topic link iconKonwencje składni języka Transact-SQL

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 ,…)

<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 oparty na tabela lub widoku.Indeks unikatowy to jedna w którym nie dwa wiersze są mogą mieć ten sam indeks klucz wartości.Indeks klastrowany w widoku musi być unikatowa.

    The Database Engine does not allow creating a indeks unikatowy on columns that already include duplicate values, whether or not IGNORE_DUP_KEY is zestaw to ON. Jeśli zostanie podjęta próba, Database Engine Wyświetla komunikat o błędzie. Zduplikowane wartości muszą być usunięte przed utworzeniem indeks unikatowy na kolumna lub kolumn.Kolumny, które są używane w unikatowy indeks powinien być ustawiony na NOT NULL, ponieważ wiele wartości null są traktowane jako duplikaty, kiedy tworzony jest indeks unikatowy.

  • KLASTROWANY
    Tworzy indeks, w którym logicznemu porządkowi wartości klucz określa kolejność fizyczna odpowiadających im wierszy w tabela.U dołu lub z typu liść, poziom indeks klastrowany zawiera rzeczywiste dane wierszy w tabela.tabela lub widok jest dozwolona w danej chwili jeden indeks klastrowany.Aby uzyskać więcej informacji zobaczStruktury indeks klastrowany.

    Widok z unikatowy indeks klastrowany jest określany jako widok indeksowany.Tworzenie unikatowego indeks klastrowany w widoku fizycznie materializes widoku.Unikatowego indeks klastrowany należy utworzyć w widoku, przed inne indeksy mogą być definiowane w jednym widoku.Aby uzyskać więcej informacji zobaczWidoki indeksowane projektowania.

    Tworzenie indeks klastrowany przed utworzeniem wszelkie ponownego zbudowania indeksów nie klastrowanych.Istniejące indeksy nieklastrowany w tabelach są przebudowywane podczas tworzenia indeks klastrowany.

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

    Uwaga

    Ze względu na poziom poziom liścia indeks klastrowany i stron danych są takie same, zgodnie z definicją, tworzenie indeks klastrowany i używanie ON partition_scheme_name lub w filegroup_name Klauzula skutecznie przenosi tabela z grupa plików, w którym został utworzony w tabela nowy schemat partycji lub grupa plików. Przed utworzeniem tabel lub indeksy w określonym filegroups należy sprawdzić filegroups, które są dostępne i czy mają one puste miejsca dla indeksu.Aby uzyskać więcej informacji zobaczDetermining Index Disk Space Requirements.

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

    Każda tabela może mieć maksymalnie 999 nieklastrowany indeksy, niezależnie od tego, jak tworzone są indeksy: albo niejawnie klucz podstawowy i ograniczeń UNIQUE lub jawnie CREATE INDEX.

    Dla widoków indeksowanych ponownego zbudowania indeksów nie klastrowanych mogą być tworzone tylko w widoku, który został już zdefiniowany unikatowy indeks klastrowany.

    Wartość domyślna to NONCLUSTERED.

  • index_name
    To nazwa indeksu.Nazwy indeksu musi być unikatowa w obrębie tabela lub widoku, ale nie muszą być unikatowe w bazie danych.Indeks nazwy muszą być zgodne z regułami identyfikatory.

  • column
    To kolumna lub kolumn, na której oparty jest indeks.Określ dwa lub więcej nazw kolumn, aby utworzyć indeks złożony dla połączonych wartości w podanych kolumnach.Lista kolumn, które mają zostać uwzględnione w indeks złożony, aby priorytet sortowania, wewnątrz nawiasów po table_or_view_name.

    Maksymalnie 16 kolumn można połączyć w jeden indeks złożony klucz.Wszystkie kolumny klucz złożonego indeksu musi być w tej samej tabela lub widoku.Maksymalny dozwolony rozmiar wartości indeksu Scalonej to 900 bajtów.Aby uzyskać więcej informacji na temat kolumn typu zmiennej w indeksach projektu wstępnego zobacz sekcję Spostrzeżenia.

    Obiektów typu kolumny, które są duże obiektu (LOB) typy danych ntext, text, varchar(max), nvarchar(max), varbinary(max), xml, lub image Nie można określić jako kolumny kluczy indeksu. Ponadto nie może zawierać definicji widoku ntext, text, lub image kolumny, nawet jeśli nie są one wywoływane w instrukcja CREATE INDEX.

    Można utworzyć indeksy na zdefiniowany przez użytkownika typ danych CLR kolumny, jeśli typ obsługuje binarne kolejności.Można również utworzyć indeksy na kolumna obliczane, które są zdefiniowane jako wywołania metoda poza kolumną typ zdefiniowany przez użytkownika, tak długo, jak metoda są oznaczane deterministyczny i nie należy wykonywać operacje dostępu do danych.Aby uzyskać więcej informacji na temat indeksowania CLR kolumny typ zdefiniowany przez użytkownika Zobacz Środowisko CLR typy zdefiniowane przez użytkownika.

  • [ASC | DESC]
    Określa rosnący lub malejący kierunek sortowania kolumna określonego indeksu.Wartość domyślna to ASC.

  • INCLUDE **(**column [ ,... n ] )
    Określa kolumny klucz nie ma być dodany do poziomu poziom liścia indeks nieklastrowany.Indeks nieklastrowany może być unikatowy lub nieunikatowy.

    Nazwy kolumn nie mogą się powtarzać na liście INCLUDE i nie można jednocześnie używać zarówno jako klucz, jak i kolumna nie będąca kluczem.Jeżeli indeks klastrowany jest zdefiniowane w tabela ponownego zbudowania indeksów nie klastrowanych zawsze zawiera kolumny indeksu klastrowanego.Aby uzyskać więcej informacji zobaczIndex with Included Columns.

    Dozwolone są wszystkie typy danych, z wyjątkiem text, ntext, a image. Indeks musi zostać utworzony lub ponownie w trybie offline (ONLINE = OFF) Jeśli dowolnego z określonym innym niż-klucz są kolumny varchar(max), nvarchar(max), lub varbinary(max) typy danych.

    Obliczane kolumny, które są deterministyczny i precyzyjne albo nieprecyzyjne mogą być dołączone kolumny.Kolumny obliczane pochodne image, ntext, text, varchar(max), nvarchar(max), varbinary(max), a xml typy danych mogą być zawarte w innych niż-klucz kolumn tak długo, jak typy danych kolumna obliczana jest dopuszczalne jako kolumna dołączone. Aby uzyskać więcej informacji zobaczTworzenie indeksów na kolumny obliczane.

    Aby uzyskać informacje na temat tworzenia indeksu XML zobacz CREATE XML INDEX (Transact-SQL).

  • WHERE < filter_predicate >
    Tworzy indeks filtrowane przez określenie wiersze, które mają zostać uwzględnione w indeksie.Filtrowane indeks musi być indeks nieklastrowany dla tabela.Tworzy filtrowane dane statystyczne dotyczące wierszy danych w przefiltrowanych indeksu.

    Filtr predykat używa prostego porównania logikę i nie może odwoływać się kolumna obliczana, kolumna UDT, kolumny Typ danych przestrzennej lub danych hierarchyID typu kolumny.Oryginalne ustawienia te są używane, gdy procedura przechowywana jest wykonywane.Dlatego ustawienia sesja klient zestaw QUOTED_IDENTIFIER i zestaw ANSI_NULLS są ignorowane, gdy procedura przechowywana jest uruchomiony.

    Inne opcje, takie jak zestaw ARITHABORT zestaw, zestaw ANSI_WARNINGS lub ANSI_PADDINGS zestaw nie są zapisywane po utworzeniu lub zmodyfikowaniu procedura przechowywana.

    WHERE StartDate > '20000101' AND EndDate <= '20000630'

    WHERE ComponentID IN (533, 324, 753)

    WHERE StartDate IN ('20000404', '20000905') AND EndDate IS NOT NULL

    Filtrowane indeksów nie mają zastosowania do indeksów XML i indeksy pełnotekstowe.Dla indeksów UNIQUE tylko zaznaczone wiersze muszą mieć wartości indeks unikatowy.Filtrowane indeksów nie zezwalają na opcję IGNORE_DUP_KEY.

  • ON partition_scheme_name**(column_name)**
    Określa schemat partycji, która definiuje filegroups, na którym będą mapowane partycji indeks partycjonowany.The partition scheme must exist within the database by executing either CREATE PARTITION SCHEME or ALTER PARTITION SCHEME.column_name specifies the column against which a partitioned index will be partitioned.This column must match the data type, length, and precision of the argument of the partition function that partition_scheme_name is using.column_name is not restricted to the columns in the index definition.Wszystkie kolumna w tabela bazowa można określić, z wyjątkiem przypadków, gdy partycjonowanie indeks unikatowy, column_name musi być wybrana spośród tych, które są używane jako unikatowy klucz. Umożliwia to ograniczenie Database Engine Aby sprawdzić unikatowości wartości klucz tylko jednej partycji.

    Uwaga

    Gdy partition-unikatowego klastrowanego indeksu, Database Engine Domyślnie dodaje partycjonowanie kolumny do listy kluczy indeks klastrowany, jeśli nie został jeszcze określony. Podczas partycjonowania nieunikatowy nieklastrowany indeks, Database Engine dodaje kolumna partycjonowania jako kolumna nie będąca kluczem (włączone) indeksu, jeśli nie jest już określony.

    Jeśli partition_scheme_name lub filegroup nie podano w tabela jest podzielony na partycje, indeks znajduje się w ten sam schemat partycjonowanie, przy użyciu tej samej kolumnie partycjonowanie na partycje, jak tabela źródłowa.

    Uwaga

    Nie można określić schemat partycjonowanie na partycje na indeks XML.Jeśli w tabela bazowa jest podzielony na partycje, indeksu XML wykorzystuje ten sam schemat partycji w tabeli.Aby uzyskać informacje na temat tworzenia indeksu XML zobacz CREATE XML INDEX (Transact-SQL).

    Aby uzyskać więcej informacji na temat indeksów partycjonowanie na partycje Zobacz Special Guidelines for Partitioned Indexes.

  • ON filegroup_name
    Tworzy określony indeks na określoną grupa plików.Jeśli lokalizacja nie jest określony, tabela lub widok, jest nie na partycje, indeks używa grupa plików, w tym samym jako podstawowej tabela lub widoku.grupa plików, w musi już istnieć.

  • ON **"**domyślne "
    Tworzy określony indeks na grupa plików domyślnych.

    Domyślnie okres, w tym kontekście nie jest słowem kluczowym.It is an identifier for the default filegroup and must be delimited, as in ON "default" or ON [default].Jeżeli określono wartość "" domyślny", opcja QUOTED_IDENTIFIER musi być włączone dla bieżącej sesja.Jest to ustawienie domyślne.Aby uzyskać więcej informacji zobaczzestaw QUOTED_IDENTIFIER (języka 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.Klauzula FILESTREAM_ON umożliwia FILESTREAM danych mają być przeniesione na inny FILESTREAM grupa plików lub partycji, schemat.

    filestream_filegroup_name jest to nazwa grupa plików FILESTREAM.grupa plików, w musi mieć jeden plik zdefiniowane dla grupa plików, w przy użyciu TWORZENIE BAZY DANYCH or ZMIENIANIE BAZY DANYCH instrukcja; w przeciwnym razie spowodował błąd.

    Jeśli w tabela jest podzielony na partycje, klauzula FILESTREAM_ON muszą być włączone i należy określić plan filegroups FILESTREAM korzystającego z tej samej funkcja partycji i partycji kolumn jako schemat partycji tabela partycji.W przeciwnym razie jest spowodował błąd.

    Jeśli tabela nie jest podzielony na partycje, nie mogą być podzielone na partycje kolumna FILESTREAM.FILESTREAM dane w tabela muszą być przechowywane w jedną grupa plików, określone w klauzula FILESTREAM_ON.

    FILESTREAM_ON NULL mogą być określone w instrukcja CREATE INDEX w tabela nie zawiera kolumna FILESTREAM, jeśli tworzony jest indeks klastrowany.

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

<obiekt>::=

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

  • database_name
    Jest nazwą bazy danych.

  • schema_name
    To nazwa schematu, do której należy tabela lub widok.

  • table_or_view_name
    To nazwa tabela lub widoku do indeksowania.

    W widoku musi być zdefiniowana z SCHEMABINDING, aby utworzyć indeks.Unikatowego indeks klastrowany należy utworzyć w widoku, przed utworzeniem każdy indeks nieklastrowany.Aby uzyskać więcej informacji na temat widoków indeksowanych zobacz sekcję Spostrzeżenia.

<relational_index_option>::=

Określa, jakie opcje będą używane podczas tworzenia indeksu.

  • TABELA
    Określa, że wartość zwracaną przez funkcja zwracająca tabelę jest tabela.Wartością domyślną jest OFF.

    • DALEJ
      Procent wolnego miejsca, która jest określona przez fillfactor zostanie zastosowany do stron pośrednich poziomów wskaźnika.

    • Jeśli nie chcesz wykonać kopie zapasowe dziennika, należy użyć prostej model odzyskiwanie.fillfactor
      Strony poziom pośrednich są wypełniane bliskiej zdolności produkcyjnych, pozostawiając wystarczająco dużo miejsca dla co najmniej jeden wiersz maksymalnego rozmiaru indeksu może mieć, biorąc pod uwagę zestaw kluczy na stronach pośrednich.

    PAD_INDEX opcja jest przydatna tylko wtedy, gdy określono FILLFACTOR, 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ża, aby umożliwić jednego wiersza, Database Engine wewnętrznie zastępuje wartości procentowej, która umożliwia minimum. Liczba wierszy strona indeksu pośrednich nigdy nie jest mniej niż dwa, niezależnie od sposobu niskie wartości fillfactor.

    W składni zgodne ze starszymi wersjami, jest równoważne Z PAD_INDEX WITH PAD_INDEX = ON.

  • FILLFACTOR **=**fillfactor
    Specifies a percentage that indicates how full the Database Engine should make the leaf level of each index page during index creation or rebuild.fillfactor must be an integer value from 1 to 100.Wartość domyślna to 0.Jeśli fillfactor to 100 lub 0, Database Engine tworzy indeksy ze stronami liść wypełnienia pojemności.

    Uwaga

    Wypełnienie współczynnik wartości 0 i 100 są takie same w każdym względem.

    Ustawienie FILLFACTOR ma zastosowanie tylko wtedy, gdy indeks jest tworzony lub ponownie zbudowana.The Database Engine does not dynamically keep the specified percentage of empty space in the pages.Aby wyświetlić ustawienia współczynnik wypełnienia, należy użyć sys.Indexes Służy do wyświetlania katalogu.

    Important noteImportant Note:

    Tworzenie indeks klastrowany z FILLFACTOR mniejsza niż 100 wpływa na ilość miejsca do magazynowania danych zajmuje ponieważ Database Engine Rozkłada danych podczas tworzenia indeks klastrowany.

    Aby uzyskać więcej informacji zobacz Fill Factor.

  • SORT_IN_TEMPDB = {NA | WYŁĄCZONA}
    Określa, czy do przechowywania tymczasowych sortowania wyniki w tempdb.Wartością domyślną jest OFF.

    • DALEJ
      Wyniki sortowania pośrednie, które służą do konstruowania indeksu są przechowywane w tempdb.Może to zmniejszyć czas wymagany do tworzenia indeksu, jeśli tempdb znajduje się na inny zestaw dysków niż baza danych użytkownika.Opcja NO_TRUNCATE kopia zapasowa dziennik jest równoznaczne z wpisaniem COPY_ONLY i CONTINUE_AFTER_ERROR.

    • WYŁĄCZANIE
      Bez opcji NO_TRUNCATE baza danych musi być w trybie ONLINE.

    Oprócz miejsca do utworzenia indeksu, wymagany baza danych użytkownika tempdb musi mieć informacje o tej samej ilości dodatkowego miejsca do przechowywania wyniki pośrednich sortowania.Aby uzyskać więcej informacji zobacztempdb and Index Creation.

    W składni zgodne ze starszymi wersjami, jest równoważne Z SORT_IN_TEMPDB WITH SORT_IN_TEMPDB = ON.

  • Wbudowane funkcje skojarzone zmiennych zwrotu nie jest konieczne.
    Określa odpowiedź o błędzie podczas próby wstawienia duplikat operację wstawiania klucz wartości do unikatowego indeksu.Opcja IGNORE_DUP_KEY dotyczy tylko wstawianie operacji po utworzeniu indeksu lub ponownie.Opcja jest ignorowany podczas wykonywania TWORZENIE INDEKSU, ZMIANA INDEKSU, or AKTUALIZACJA.Wartością domyślną jest OFF.

    • DALEJ
      Komunikat ostrzegawczy zostanie przeprowadzona, gdy zduplikowane klucz wartości są wstawiane do unikatowego indeksu.Tylko wiersze naruszenie ograniczenia unikatowości nie powiedzie się.

    • WYŁĄCZANIE
      Komunikat o błędzie będzie występować wówczas, gdy zduplikowane wartości kluczy są wstawiane do unikatowego indeksu.Całą operację WSTAWIANIA będzie można wycofać.

    Nie może być IGNORE_DUP_KEY zestaw on indeksy utworzone na widok, Indeksy nieunikatowe, indeksy XML, przestrzennej indeksy i filtrowane indeksów.

    Aby wyświetlić IGNORE_DUP_KEY, należy użyć sys.Indexes.

    W składni zgodne ze starszymi wersjami, jest równoważne Z IGNORE_DUP_KEY WITH IGNORE_DUP_KEY = ON.

  • STATISTICS_NORECOMPUTE = { ON | OFF}
    Określa, czy są obliczane ponownie statystyki rozkładu.Domyślnie opcja ta jest wyłączona.

    • DALEJ
      Klauzula STANDBY zapisuje gotowości danych (wykonywanie wycofywania, ale z możliwością dalsze przywraca).

    • WYŁĄCZANIE
      Za pomocą opcji STANDBY jest równoznaczne z następują przywracanie WITH STANDBY NORECOVERY WITH dla dziennik kopia zapasowa.

    Aby przywrócić statystyk automatycznych aktualizacji, zestaw STATISTICS_NORECOMPUTE do OFF, lub wykonywania aktualizacja statystyki bez klauzula NORECOMPUTE.

    Important noteImportant Note:

    Wyłączanie automatycznego recomputation statystyk dystrybucji może uniemożliwić pobieranie wykonanie optymalne plany kwerend obejmujących tabela optymalizator kwerendy.

    W składni zgodne ze starszymi wersjami, jest równoważne Z STATISTICS_NORECOMPUTE WITH STATISTICS_NORECOMPUTE = ON.

  • DROP_EXISTING = {NA | WYŁĄCZONA}
    Określa, że nazwany, istniejący wcześniej klastrowany lub nieklastrowany jest usunięty, a zostanie przebudowany.Wartością domyślną jest OFF.

    • DALEJ
      Istniejący indeks jest usunięty, a następnie zostanie przebudowany.Określona nazwa indeksu musi być taka sama, jak aktualnie istniejącego indeksu, jednak mogą być modyfikowane definicji indeksu.Na przykład można określić różnych kolumn, kolejność sortowania, schemat partycji lub opcje indeksu.

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

    Typ indeksu nie można zmienić za pomocą DROP_EXISTING.

    W składni zgodne ze starszymi wersjami, jest równoważne Z DROP_EXISTING WITH DROP_EXISTING = ON.

  • TRYB ONLINE = {NA | WYŁĄCZONA}
    Określa, czy są dostępne do modyfikacji kwerendy i danych podczas operacji indeksu tabel i indeksów skojarzonych.Wartością domyślną jest OFF.

    Uwaga

    Są dostępne tylko w operacji indeksu online SQL Server Wersje Enterprise Developer i oceny.

    • DALEJ
      Długotrwałe blokady tabeli nie są nakładane przez czas trwania operacji indeksu.Podczas głównej fazy operacji indeksu jest nałożona tylko blokada Udostępnianie zamierzone tabeli źródłowej.Umożliwia to kontynuowanie kwerend lub aktualizacji na wewnętrznej tabeli i indeksach.W chwili rozpoczęcia operacji indeksu na obiekt źródłowy przez bardzo krótki czas jest nakładana blokada Udostępnianie.Po zakończeniu operacji na źródło jest przez bardzo krótki czas nakładana blokada Udostępnianie, o ile jest tworzony indeks nieklastrowany, pobrano blokadę Modyfikacja schematu podczas tworzenia lub upuszczania w trybie online indeksu klastrowanego bądź jest odbudowywany indeks klastrowany lub nieklastrowany.Opcji ONLINE nie można włączyć, jeśli jest tworzony indeks lokalnej tabeli tymczasowej.

    • WYŁĄCZANIE
      W takich przypadkach można pominąć te wpisy dziennika za pomocą flagi śledzenia 3226, jeśli żadna ze skryptów zależy od tych zapisów.Obcinania dziennik transakcjiAby uniknąć wypełnianie dziennik transakcji bazy danych, niezbędne są rutynowego tworzenia kopii zapasowych.W obszarze proste model odzyskiwanie, obcinania dziennika zostanie automatycznie po wykonanie tworzyć kopię zapasową zapasowej bazy danych oraz w pełni model odzyskiwanie, po wysłaniu tworzyć kopię zapasową zapasowej dziennik transakcji.Jednak czasami proces obcinania może być opóźnione.

    Aby uzyskać więcej informacji zobaczHow Online Index Operations Work.Aby uzyskać więcej informacji na temat blokady Zobacz Tryby blokada.

    Indeksy, w tym indeksy na tabelach tymczasowych globalnych, można utworzyć online z następującymi wyjątkami:

    • Indeks XML.

    • Indeks w lokalnej tabela tymczasowej.

    • Początkowe unikatowego indeks klastrowany w widoku.

    • Wyłączone indeksów klastrowanych.

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

    • Indeks nieklastrowany zdefiniowane przy użyciu kolumn typu dane LOB.

      Uwaga

      Nieunikatowy indeks nieklastrowany mogą być tworzone online w przypadku, gdy tabela zawiera typy dane LOB, ale żadna z tych kolumn są używane w definicji indeksu jako klucz lub nie będąca kluczem kolumny (włączone).

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

  • Czy pojedynczej instrukcja SELECT określa wartość zwracaną przez wbudowanego funkcja zwracająca tabelę.
    Określa, czy są dozwolone blokady wierszy.Domyślnie opcja ta jest włączona.

    • DALEJ
      Są dozwolone blokady wierszy podczas uzyskiwania dostępu do indeksu.Program Database Engine określa, kiedy są stosowane blokady wierszy.

    • WYŁĄCZANIE
      plik rezerwowy staje się częścią bazy danych.

  • Określa kolejność, w którym są są zwracane wyniki z funkcja wycenione tabela.
    Aby uzyskać więcej informacji zobacz sekcję "Wskazówki na używanie kolejność sortowania," w dalszej części tego tematu.Wartością domyślną jest włączone.

    • DALEJ
      Ten plik zawiera walcowanego zmian, które muszą zostać wystornowane przywracanie dziennik operacji mają być zastosowane później z powrotem.The Database Engine determines when strona locks are used.

    • WYŁĄCZANIE
      Może być za mało miejsca na dysku dla pliku stanu gotowości do wzrostu tak, że może on zawierać wszystkie różne strony z bazy danych, które zostały zmodyfikowane przez wycofywanie niezakończone transakcje.

  • MAXDOP = max_degree_of_parallelism
    Zastępuje maksymalny stopień proste opcja konfiguracja na czas trwania operacji indeksu.W celu ograniczenia liczby procesorów używanych w realizacji planu równoległych, należy użyć MAXDOP.Maksymalna to 64 procesorów.

    max_degree_of_parallelism może być:

    • 1
      Wyłącza generowanie planu równoległych.

    • >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ślny)
      Używa rzeczywista liczba procesorów lub mniej oparte na bieżącym obciążenia systemu.

    Aby uzyskać więcej informacji zobacz Konfigurowanie równoległa operacje indeksu.

    Uwaga

    Są dostępne tylko w operacji równoległych indeksu SQL Server Wersje 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
      Nie są kompresowane indeksie lub na określonej partycji.

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

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

    Aby uzyskać więcej informacji dotyczących kompresji zobacz Creating Compressed Tables and Indexes.

  • ON PARTITIONS ( { <partition_number_expression> | <range> } [ ,...n ] )
    Określa, do których stosuje się ustawienie DATA_COMPRESSION partycji.Jeśli indeks nie jest podzielony na partycje, argument na PARTYCJE spowoduje wystąpienie błędu.Jeśli klauzula ON PARTYCJI nie zostanie podana, opcja DATA_COMPRESSION odnosi 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 pojedynczych partycji, oddzielając je średnikami, na przykład numerów partycji: NA PARTYCJACH (1, 5).

    • Zapewniają zarówno zakresów, jak i poszczególnych partycji, na przykład: używane przez proces kopia zapasowa online umożliwiające tworzenie kopia zapasowa bazy danych w czasie, gdy baza danych jest nadal w użyciu.

    <zakres> można określić jako liczby partycji, oddzielając słowa do, na przykład: NA PARTYCJACH (OD 6 DO 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)
    )
    

Remarks

Podobnie jak inne kwerendy jest zoptymalizowany instrukcja CREATE INDEX.Aby zapisać w operacjach wejścia/wyjścia, procesor kwerend mogą zdecydować się na skanowanie indeks zamiast przeprowadzania skanowanie tabela.W niektórych sytuacjach może być wyeliminowane operacji sortowania.Na komputerach wieloprocesorowych, na których jest uruchomiony SQL Server 2005 Enterprise Edition lub SQL Server 2008CREATE 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 kwerendy. Aby uzyskać więcej informacji zobaczKonfigurowanie równoległa operacje indeksu.

Operacja tworzenia indeksu może być minimalny zestaw zalogowany, jeżeli modelu odzyskiwanie bazy danych jest ustawiony na rejestrowane zbiorczego lub proste.Aby uzyskać więcej informacji zobaczChoosing a Recovery Model for Index Operations.

Indeksy mogą być tworzone na tabela tymczasowa.W tabela zostanie usunięte lub kończy sesja, indeksy są usuwane.

Indeksy obsługują właściwości rozszerzonych.Aby uzyskać więcej informacji zobaczZa pomocą właściwości rozszerzonych na obiekty bazy danych.

Indeksy klastrowane

Tworzenie indeksu klastrowanego w tabela (sterty) lub usunięcie i ponowne tworzenie istniejący indeks klastrowany wymaga dodatkowych obszaru roboczego mają być dostępne w bazie danych do sortowania danych i tymczasową kopię oryginalnej tabela lub istniejące dane indeksu klastrowanego.Aby uzyskać więcej informacji zobaczDetermining Index Disk Space Requirements.Aby uzyskać więcej informacji na temat indeksów klastrowanych zobacz Creating Clustered Indexes.

Indeksy unikatowe

Jeśli istnieje indeks unikatowy, Database Engine sprawdza, czy powtarzające się wartości każdego dane o czasie zostanie dodany przez operacje wstawiania. Operacje wstawiania generujących zduplikowane wartości kluczy są przywracane, a także Database Engine Wyświetla komunikat o błędzie. Ta zasada obowiązuje, nawet jeśli operację wstawiania zmienia się wiele wierszy, ale powoduje, że tylko jeden duplikat.Jeśli próby wprowadzania danych, dla których jest indeks unikatowy, a klauzula IGNORE_DUP_KEY jest ustawiona na ON, tylko te wiersze, naruszenie niepowodzenie UNIQUE indeksu.Aby uzyskać więcej informacji na temat unikatowe indeksy zobacz Creating Unique Indexes.

Indeksy podzielonym na partycje

Indeksy podzielonym na partycje są tworzone i obsługiwane w sposób podobny do tabel podzielonym na partycje, ale tak jak zwykłych indeksy są obsługiwane jako oddzielne obiekty.Masz podzielonym na partycje indeksu dla tabela, która nie jest na partycje i masz nonpartitioned indeksu dla tabela, która jest już podzielony na partycje.

Jeśli w przypadku tworzenia indeksu na tabela partycjonowana, a nie określono grupa plików w którym umieścić indeksu, indeks jest już podzielony na partycje w taki sam sposób, jak tabela źródłowa.Dzieje się tak, ponieważ indeksy, domyślnie są umieszczane w tym samym filegroups jako ich tabel podstawowych, a w tabela partycjonowana w ten sam schemat partycjonowanie, używa tych samych kolumn partycjonowanie na partycje.

Podczas partycjonowania-unikatowego klastrowanego indeksu, Database Engine Domyślnie dodaje partycjonowanie kolumny do listy kluczy indeks klastrowany, jeśli nie jest jeszcze określony.

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

Widoki indeksowane

Tworzenie unikatowego indeks klastrowany w widoku wykresu poprawia 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 kwerendy za pomocą widoków indeksowanych.W widoku nie musi odwoływać się w kwerendzie do optymalizowania należy rozważyć tego widoku do podstawiania.

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

  1. Sprawdź opcje zestaw są poprawne dla wszystkich istniejących tabel, które będzie odwoływać się w widoku.

  2. Sprawdź opcje zestaw dla sesja są poprawnie ustawione przed utworzeniem wszelkie nowe tabele i widok.

  3. Sprawdź, czy w definicji widoku jest deterministyczny.

  4. Tworzenie widoku za pomocą opcji WITH SCHEMABINDING.

  5. Tworzenie unikatowego indeks klastrowany w widoku.

Wymagane opcje zestaw dla widoków indeksowanych

Ocena takie same wyrażenie może wygenerować różne wyniki w Database Engine Jeśli po wykonaniu kwerendy aktywne są różne opcje zestaw. Na przykład po opcji zestaw CONCAT_NULL_YIELDS_NULL jest ustawiona na ON, wyrażenie "abc" + Wartość NULL, zwraca wartość NULL.Jednak po CONCAT_NULL_YIEDS_NULL zestaw do OFF, tym samym wyrażeniu daje "abc".

Aby upewnić się, że w widokach można obsługiwać poprawnie i zwracają wyniki zgodne, widoki indeksowane wymaga wartości stałe kilka opcji zestaw.The SET options in the following table must be set to the values shown in the RequiredValue column whenever the following conditions occur:

  • Widok indeksowany jest tworzony.

  • Nie ma żadnych wstawiania, aktualizacji lub usuwania operacje wykonywane na dowolnej tabela, która uczestniczy w widok indeksowany.Dotyczy to także operacji, takich jak kopiowanie masowe, replikacja i kwerendami rozproszonymi.

  • Widok indeksowany jest używany przez optymalizator kwerendy do wygenerowania planu kwerend.

    Opcje zestaw

    Wymagana wartość

    Wartość domyślna serwera

    Default

    Wartość OLE DB i ODBC

    Default

    Wartość biblioteki DB

    ANSI_NULLS

    DALEJ

    DALEJ

    DALEJ

    WYŁĄCZANIE

    ANSI_PADDING

    DALEJ

    DALEJ

    DALEJ

    WYŁĄCZANIE

    ANSI_WARNINGS *

    DALEJ

    DALEJ

    DALEJ

    WYŁĄCZANIE

    ARITHABORT

    DALEJ

    DALEJ

    WYŁĄCZANIE

    WYŁĄCZANIE

    CONCAT_NULL_YIELDS_NULL

    DALEJ

    DALEJ

    DALEJ

    WYŁĄCZANIE

    NUMERIC_ROUNDABORT

    WYŁĄCZANIE

    WYŁĄCZANIE

    WYŁĄCZANIE

    WYŁĄCZANIE

    QUOTED_IDENTIFIER

    DALEJ

    DALEJ

    DALEJ

    WYŁĄCZANIE

    *zestawting ANSI_WARNINGS do ON niejawnie zestaw s ARITHABORT on, gdy poziom zgodności bazy danych jest zestaw 90 lub wyższym.Jeśli poziom zgodności bazy danych jest ustawiony na 80 lub wcześniej, opcja ARITHABORT musi jawnie ustawiona na ON.

Jeśli używasz połączenia serwera OLE DB lub ODBC jedyną wartością, którą należy zmodyfikować to ustawienie ARITHABORT.Wszystkie wartości biblioteki DB należy ustawić poprawnie poziom serwera przy użyciu sp_configure lub z aplikacji za pomocą polecenia zestaw.Aby uzyskać więcej informacji na temat opcji zestaw zobacz Korzystanie z narzędzia Opcje w programie SQL Server.

Important noteImportant Note:

Zaleca się, że opcja ARITHABORT użytkowników zestaw całego serwera on natychmiast po pierwszym indeksowane widoku lub w dowolnej bazy danych na serwerze zostanie utworzony indeks dla kolumna obliczana.

Funkcje deterministyczny

Definicja widok indeksowany musi być deterministyczny.Widok jest deterministyczny, jeżeli wszystkie wyrażenia na liście select, podobnie jak WHERE i deterministyczny klauzule GROUP BY.Wyrażenia deterministyczny zawsze zwraca ten sam wynik dowolnej czas oceniane są z określonym zestaw wartości wejściowych.Tylko deterministyczny funkcji może uczestniczyć w wyrażeniach deterministyczny.Na przykład funkcja DATEADD jest deterministyczny, ponieważ zawsze zwraca to samo dla wszystkich określony zestaw wartości argumentu dla swoich trzech parametrów.GETDATE nie jest deterministyczny, ponieważ zawsze jest wywoływana z tego samego argumentu, ale wartość zwracana za każdym razem, jest ono wykonane zmiany.Aby uzyskać więcej informacji zobaczDeterministic and Nondeterministic Functions.

Nawet wtedy, gdy wyrażenie jest deterministyczny, jeśli zawiera ona wyrażeń LANE dokładnych wyników może zależeć wersja mikrokodu lub architektury procesora.W celu zapewnienia integralność danych, określenia takie mogą uczestniczyć tylko jako nie-klucz kolumn widoków indeksowanych.Nazywane są dokładne deterministyczny wyrażeń, które nie zawierają wyrażenia zmiennoprzecinkowych.Tylko dokładne deterministyczny wyrażenia mogą uczestniczyć w kolumnach kluczy i WHERE lub klauzul GROUP BY widoków indeksowanych.

Użycie IsDeterministic Właściwość COLUMNPROPERTY funkcja można określić, czy kolumna widoku jest deterministyczny.Użycie IsPrecise właściwość funkcja COLUMNPROPERTY, aby ustalić, czy deterministyczny kolumna w widoku z wiązanie schematu jest dokładne.COLUMNPROPERTY zwraca 1, jeśli ma wartość PRAWDA, 0, jeżeli jest fałszywa (FAŁSZ) i wartość NULL dla danych wejściowych, które nie jest prawidłowy.Oznacza to, kolumna nie jest deterministyczny ani nie dokładne.

Wymagania dodatkowe

Oprócz opcji zestaw i wymagań funkcja deterministyczny muszą być spełnione następujące wymagania:

  • Użytkownik wykonujący CREATE INDEX musi być właściciel w widoku.

  • Jeśli w definicji widoku zawiera klauzulę GROUP BY, klucz unikatowy indeks klastrowany może odwoływać się tylko te kolumny, które są określone w klauzula GROUP BY.

  • Tabele bazowe musi być ustawiony na prawidłowe opcje zestaw czas jest tworzony w tabela lub jej nie może odwoływać się w widoku z wiązanie schematu.

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

  • Funkcje zdefiniowane przez użytkownika muszą być tworzone za pomocą opcji WITH SCHEMABINDING.

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

  • W widoku musi zostać utworzony przy użyciu opcji WITH SCHEMABINDING.

  • W widoku musi odwoływać się tylko tabele bazowe w tej samej bazie danych, nie do innych widoków.

  • Definicja widoku nie może zawierać następujące czynności:

    COUNT(*)

    Funkcja zestawu zestaw wierszy

    tabela pochodnej

    samosprzężenie

    DISTINCT

    ODCH.STANDARDOWE, WARIANCJI, AVG

    float*, text, ntext, lub image kolumny

    podkwerenda

    Predykaty pełnego tekstu (KILO, FREETEXT)

    Suma na pustych wyrażenie.

    Środowisko CLR zdefiniowanej przez użytkownika funkcja agregacja

    U GÓRY

    MIN, MAX

    UNIA

    * Widok indeksowany, może zawierać float kolumny; jednak takich kolumn nie może zostać włączony klucz indeks klastrowany.

Jeżeli GROUP BY, definicja WIDOKU musi zawierać COUNT_BIG(*) i nie może zawierać HAVING.Te ograniczenia GROUP BY są stosowane wyłącznie do definicji widok indeksowany.Kwerendę można użyć widok indeksowany w jego plan wykonania, nawet jeśli nie spełnia te ograniczenia GROUP BY.

W tabela partycjonowana można utworzyć widoki indeksowane i mogą sami można podzielić na partycje.Aby uzyskać więcej informacji dotyczących partycjonowanie zobacz poprzednią sekcję "Indeksy podzielony na partycje".

Aby zapobiec Database Engine Używanie widoków indeksowanych, należy dołączyć wskazówki OPTION (WIDOKI EXPAND) na tej kwerendzie. Ponadto jeśli dowolne z wymienionych opcji są ustawione niepoprawnie, ta opcja będzie zapobiegać Optymalizator przy użyciu indeksy w widokach.Aby uzyskać więcej informacji na temat Wskazówki OPTION (WIDOKI EXPAND) zobacz SELECT (Transact-SQL).

Poziom zgodności bazy danych nie może być mniejsza niż 80.Baza danych zawierająca widok indeksowany nie można zmienić poziom niższym niż 80 zgodności.

Filtrowane indeksów

Filtrowane indeks jest zoptymalizowana indeks nieklastrowany, nadaje się do kwerendy, wybrać niewielki procent wierszy z tabela.Predykat filtru wykorzystuje do indeksowania część danych w tabela.Dobrze indeksu filtrowane może poprawić wydajność kwerendy, obniżenie kosztów magazynowania i zmniejszyć koszty eksploatacji.

Wymagane opcje zestaw dla filtrowanych indeksów

Opcje zestaw kolumna wartości wymagane są wymagane, za każdym razem, gdy zachodzi jedno z następujących warunków:

  • Utwórz indeks filtrowane.

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

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

    Opcje zestaw

    Wymagana wartość

    ANSI_NULLS

    DALEJ

    ANSI_PADDING

    DALEJ

    ANSI_WARNINGS *

    DALEJ

    ARITHABORT

    DALEJ

    CONCAT_NULL_YIELDS_NULL

    DALEJ

    NUMERIC_ROUNDABORT

    WYŁĄCZANIE

    QUOTED_IDENTIFIER

    DALEJ

    *zestawting ANSI_WARNINGS do ON niejawnie zestaw s ARITHABORT on, gdy poziom zgodności bazy danych jest zestaw 90 lub wyższym.Jeśli poziom zgodności bazy danych jest ustawiony na 80 lub wcześniej, opcja ARITHABORT musi jawnie ustawiona na ON.

Jeśli opcje zestaw są nieprawidłowe, mogą wystąpić następujące warunki:

  • Filtrowane indeksu nie zostanie utworzony.

  • The Database Engine generates an error and rolls back INSERT, UPDATE, DELETE, or MERGE statements that change data in the index.

  • optymalizator kwerendy nie bierze pod uwagę indeksu w plan wykonania dla każdej instrukcji języka Transact-SQL.

Aby uzyskać więcej informacji na temat filtrowania indeksy zobacz Wskazówki dotyczące projektowania indeks filtrowane.

Indeksy przestrzenny

Aby uzyskać informacje na temat przestrzennej indeksów zobacz CREATE SPATIAL INDEX (Transact-SQL) i Working with Spatial Indexes (Database Engine).

Indeksy XML

Aby uzyskać informacje na temat formatu XML Zobacz indeksów CREATE XML INDEX (Transact-SQL) i Indeksy w kolumnach typu danych XML.

Rozmiar klucz indeksu

Maksymalny rozmiar dla klucz indeksu jest 900 bajtów.Indeksy na varchar kolumny, które może przekraczać 900 bajtów może zostać utworzony, jeśli istniejące dane w kolumnach nie należy przekraczać 900 bajtów w czasie, tworzony jest indeks; jednak kolejne Wstawianie lub aktualizacja akcji na kolumny, które powodują całkowity rozmiar powinien być większy niż 900 bajtów zakończy się niepowodzeniem. Aby uzyskać więcej informacji zobaczMaximum Size of Index Keys.Nie może zawierać klucz indeks klastrowany indeksu varchar kolumny zawierające dane istniejące w jednostce alokacji ROW_OVERFLOW_DATA. Jeżeli indeks klastrowany jest tworzony w varchar istniejące dane i kolumn znajduje się w jednostce alokacji IN_ROW_DATA, wstawianie kolejnych lub aktualizacja akcji kolumna, która będzie wypychanie poza wiersza danych nie powiedzie się. Aby uzyskać więcej informacji na temat jednostek alokacji zobacz Organizacja indeksu i tabela.

Ponownego zbudowania indeksów nie klastrowanych mogą być inne niż-klucz kolumn na poziomie poziom liścia indeksu.Te kolumny nie są traktowane przez Database Engine podczas obliczania rozmiaru kluczy indeksu. Aby uzyskać więcej informacji zobaczIndex with Included Columns.

Kolumny obliczanej

Indeksy mogą być tworzone na kolumny obliczane.Ponadto kolumny obliczane może mieć właściwość PERSISTED.Oznacza to, że Database Engine przechowuje obliczonych wartości w tabela i aktualizuje je po zaktualizowaniu innych kolumn, od których zależy kolumna obliczana. The Database Engine uses these persisted values when it creates an index on the kolumna, and when the index is referenced in a query.

Indeksowanie to kolumna obliczana, kolumna obliczana musi deterministyczny i dokładne.Jednak przy użyciu właściwość PERSISTED rozwija typu Indeksowalny kolumny obliczane do uwzględnienia:

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

  • Kolumny oparte na wyrażeniach deterministyczny, zgodnie z definicją są obliczane Database Engine ale nieprecyzyjne.

Kolumny obliczane trwałych wymaga następujących opcji zestaw, aby ustawić, jak w poprzedniej sekcji "" Required zestaw opcje dla indeksowanych widoki".

Ograniczenie UNIQUE lub klucz podstawowy może zawierać kolumna obliczana, dopóki spełnia wszystkich warunków dla indeksowania.W szczególności kolumna obliczana musi być deterministyczny i precyzyjne lub deterministyczny i trwałe.Aby uzyskać więcej informacji na temat determinism zobacz Deterministic and Nondeterministic Functions.

Kolumny obliczane pochodne image, ntext, text, varchar(max), nvarchar(max), varbinary(max), a xml typy danych mogą być indeksowane jako klucz lub kolumna nie będąca kluczem włączone tak długo, jak typ danych kolumna obliczana jest dopuszczalne jako kolumny klucza indeksu lub kolumna nie będąca kluczem. Na przykład można utworzyć indeksu głównego XML na obliczanych xml Kolumna. Jeśli rozmiar klucz indeks przekroczy 900 bajtów, wyświetlany jest komunikat ostrzegawczy.

Tworzenie indeksu dla kolumna obliczana może spowodować uszkodzenie wstawiania lub aktualizowanie operacji, które dotychczas działało.Takiej awarii może mieć miejsce, gdy kolumna obliczana wyniki arytmetyczne błędu.Na przykład w poniższej tabela mimo że obliczona kolumna c powoduje błąd arytmetyczne, INSERT Instrukcja działa.

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

Jeśli zamiast tego po utworzeniu tabela, można utworzyć indeks dla kolumna obliczana c, takie same INSERT Instrukcja teraz nie powiedzie się.

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 zobaczTworzenie indeksów na kolumny obliczane.

Kolumny zawarte w indeksów

Kolumny klucz bez, o nazwie dołączone kolumny mogą być dodawane do poziomu poziom liścia nieklastrowany indeks, aby poprawić wydajność kwerendy przez obejmujących kwerendy.Oznacza to wszystkie kolumny w kwerendzie znajdują się w indeksie klucz lub kolumn nie będąca kluczem.Dzięki temu optymalizator kwerendy zlokalizować wszystkie wymagane informacje z skanowanie indeksu, tabela lub indeks klastrowany danych nie jest dostępny.Aby uzyskać więcej informacji zobaczIndex with Included Columns.

Określanie opcje indeksowania

SQL Server 2005 wprowadzonego nowy indeks opcje, a także zmienia sposób, w której zostaną określone opcje.In backward compatible syntax, WITH option_name is equivalent to WITH ( <option_name> = ON ).Po ustawieniu opcji indeksu, obowiązują następujące reguły:

  • New index options can only be specified by using WITH (option_name= ON | OFF**)**.

  • Nie można określić opcje przy użyciu zarówno ze starszymi wersjami Składnia zgodna i nowych w tej samej instrukcja.Na przykład określając w (DROP_EXISTING, ONLINE**=** ON**)** powoduje, że instrukcja nie powiedzie się.

  • When you create an XML index, the options must be specified by using WITH (option_name= ON | OFF**)**.

Klauzula DROP_EXISTING

Aby odbudować indeks, dodawanie lub usuwanie kolumn, zmodyfikuj opcje, modyfikować kolejność sortowania kolumn lub zmienić schemat partycji lub grupa plików, można użyć klauzula DROP_EXISTING.

Definicja indeksu nie ulega zmianie w jakikolwiek sposób indeks wymusza ograniczenia klucz podstawowy lub UNIQUE, indeks zostanie usunięte i utworzony ponownie, zachowując istniejące ograniczenie.Niemniej jednak jeśli zostanie zmieniona definicja indeksu nie może w instrukcja.Aby zmienić definicję klucz podstawowy lub ograniczenia UNIQUE, usunąć ograniczenie i dodać ograniczenia w nowej definicji.

DROP_EXISTING zwiększa wydajność, gdy ponownie indeks klastrowany z tego samego lub innego zestaw kluczy dla tabela, która ma również ponownego zbudowania indeksów nie klastrowanych.DROP_EXISTING zastępuje wykonywanie instrukcja DROP indeks na stary indeks klastrowany następuje wykonanie instrukcja CREATE INDEX dla nowego indeksu klastrowanego.Ponownego zbudowania indeksów nie klastrowanych są przebudowywane jeden raz, a następnie tylko wtedy, gdy została zmieniona definicja indeksu.klauzula DROP_EXISTING nie odbudować ponownego zbudowania indeksów nie klastrowanych, gdy definicja indeksu jest tej samej nazwy indeksu, klucz i kolumny partycji, atrybut unikatowości i kolejność sortowania, jak oryginalny indeks.

Czy ponownego zbudowania indeksów nie klastrowanych są przebudowywane lub nie, są zawsze pozostają w ich oryginalnym filegroups lub partycji systemów i oryginalnej funkcji partycji.Jeżeli indeks klastrowany jest ponownie zbudowana na inną grupa plików lub schemat partycji, ponownego zbudowania indeksów nie klastrowanych nie są przenoszone do pokrywa się z nową lokalizację indeksu klastrowanego.Dlatego nawet nieklastrowany indeksy wcześniej wyrównane do indeks klastrowany, nie jest już mogą one być wyrównany z nim.Aby uzyskać więcej informacji na temat dostosowania indeks partycjonowany Zobacz Special Guidelines for Partitioned Indexes.

Klauzula DROP_EXISTING nie zostaną posortowane dane ponownie, jeśli ten sam indeks kolumny klucz są używane w tym samym porządku i z tego samego rosnąco lub malejąco, chyba, że instrukcja indeksu określa indeks nieklastrowany i opcja ONLINE jest zestaw na OFF.Jeżeli indeks klastrowany jest wyłączony, CREATE INDEX WITH DROP_EXISTING operacji należy wykonać z ONLINE zestaw na OFF.Jeśli indeks nieklastrowany zostanie wyłączona, nie jest skojarzony z wyłączonym indeks klastrowany z ustawić na OFF ONLINE można przeprowadzić operacji CREATE INDEX WITH DROP_EXISTING lub Wł.

Indeksy z zakresów 128 lub większą liczbą są usunięte lub odbudowany, Database Engine defers deallocations rzeczywiste strona i ich skojarzone blokady, dopóki po zatwierdzeniu transakcji. Aby uzyskać więcej informacji zobaczDropping and Rebuilding Large Objects.

Opcja ONLINE

Należy przestrzegać następujących do wykonywania operacji indeksu w trybie online:

  • tabela źródłowa Nie mogą być zmieniane, obcinane ani usunięty w czasie, gdy operacja online indeksu jest w toku.

  • Wymagane jest dodatkowe tymczasowego miejsca na dysku podczas operacji indeksu.Aby uzyskać więcej informacji zobaczDetermining Index Disk Space Requirements.

  • Online operacje mogą być wykonywane na indeksy podzielonym na partycje i indeksy, które zawierają utrwalone kolumny obliczane i objęte kolumny.

Aby uzyskać więcej informacji zobaczWykonywanie operacji indeks w trybie online.

Opcje blokowania stron i wierszy

Gdy ALLOW_ROW_LOCKS = ON i ALLOW_PAGE_LOCK = ON, wiersz, strona- i blokowania poziom tabela są dozwolone podczas uzyskiwania dostępu do indeksu.The Database Engine chooses the appropriate blokada and can escalate the blokada from a row or strona blokada to a tabela blokada. Aby uzyskać więcej informacji zobaczeskalacja blokad (aparat bazy danych).

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

Aby uzyskać więcej informacji na temat konfigurowania blokowania ziarnistość indeksu zobacz Customizing Locking for an Index.

Wyświetlanie informacji o indeksie

Aby przywrócić informacje o indeksach, można użyć katalogu widoki, funkcje systemowe i procedur przechowywanych przez system.Aby uzyskać więcej informacji zobaczViewing Index Information.

Kompresja danych

Kompresja danych jest opisany w temacie Creating Compressed Tables and Indexes. Kluczowe kwestie do rozważenia przed są następujące:

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

  • strona typu nie liść indeksu nie są kompresowane strona, ale mogą być skompresowane wiersza.

  • Każdy indeks nieklastrowany ma ustawienie indywidualnych kompresji, a nie dziedziczy ustawienie kompresji z tabela podstawowej.

  • Po utworzeniu indeks klastrowany w sterty indeks klastrowany dziedziczy stanu kompresji sterty, pod warunkiem, że nie określono stan kompresji alternatywnych.

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

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

  • Indeks ALTER <Indeks> ... REBUILD PARTITION ...syntax rebuilds the specified partition of the index.

  • Indeks ALTER <Indeks> ... REBUILD WITH ...syntax rebuilds all partitions of the index.

Aby ocenić, jak zmiana stanu kompresji wpłynie na tabela, indeks lub partycji, należy użyć sp_estimate_data_compression_savings procedura przechowywana.

Uprawnienia

Wymaga uprawnienia ALTER na tabela lub widoku.Użytkownik musi być członkiem sysadmin Rola serwera lub db_ddladmin and db_owner stałe role bazy danych.

Przykłady

A.Tworzenie prostych indeks nieklastrowany

W poniższym przykładzie tworzony jest indeks nieklastrowany na VendorID Kolumna Purchasing.ProductVendor Tabela.

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.

C.Tworzenie unikatowy indeks nieklastrowany

Poniższy przykład tworzy unikatowy indeks nieklastrowany na Name Kolumna Production.UnitMeasure Tabela. Indeks będzie wymusić unikatowość na tych danych do Name Kolumna.

Następująca kwerenda testów ograniczenie unikatowości próbując wstawić wiersz z taką samą wartość jak istniejącego wiersza.

--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 demonstruje wpływ IGNORE_DUP_KEY Opcja przez wstawianie wielu wierszy do tabela tymczasowa najpierw z opcją zestaw do ON i ponownie z opcją zestaw do OFF. Jeden wiersz jest wstawiany do #Test Wartość tabela, która spowoduje, że celowo duplikat, gdy drugi wiersz wielu INSERT Instrukcja jest wykonywany. Liczba wierszy w tabela zwraca liczbę wierszy wstawiony.

USE AdventureWorks;
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 drugi 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 Pomyślnie wstawiono tabela, która nie naruszenie ograniczenia unikatowości. Ostrzeżenie zostało wydane, a duplikaty wierszy, ignorowane, ale cała transakcja została nie wycofana.

W tym samym sprawozdaniu są uruchamiane ponownie, ale z IGNORE_DUP_KEY zestaw do OFF.

USE AdventureWorks;
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 drugi 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

Ogłoszenie 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 za pomocą DROP_EXISTING

W poniższym przykładzie spadnie i odtwarza istniejący indeks na ProductID Kolumna Production.WorkOrder tabela za pomocą DROP_EXISTING Opcja. Opcje FILLFACTOR i PAD_INDEX są także ustawić.

F.Tworzenie indeksu w widoku

Poniższy przykład tworzy widok i indeks w tym widoku.Uwzględniane są dwie kwerendy, należy użyć widok indeksowany.

G.Tworzenie indeksu dołączone kolumny (innych niż klucz)

W poniższym przykładzie tworzony jest indeks nieklastrowany o jedną kolumna klucz (PostalCode) i cztery kolumna nie będąca kluczem ()AddressLine1, AddressLine2, City, StateProvinceID). Kwerenda, która jest ujęty w następujący sposób indeksu.Aby wyświetlić indeksu wybranego przez optymalizator kwerendy na Kwerendy menu in SQL Server Management Studio, wybierz opcję Wyświetl plan rzeczywisty wykonanie przed wykonaniem kwerendy.

H.Tworzenie indeks partycjonowany

Poniższy przykład tworzy nieklastrowany indeks partycjonowany na TransactionsPS1, istniejący schemat partycji. W tym przykładzie przyjęto założenie, próbka podzielonym na partycje indeksu został zainstalowany.Informacje dotyczące instalacji zobacz Readme_PartitioningScript.

USE AdventureWorks;
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

W poniższym przykładzie tworzony jest indeks filtrowanej tabela Production.BillOfMaterials.Predykat filtru można dołączyć kolumny, które nie są kolumn klucz w indeksie filtrowane.Predykat w tym przykładzie wybiera tylko te wiersze, gdzie EndDate jest inne niż NULL.

J.Tworzenie skompresowanego indeksu

Poniższy przykład tworzy indeks dla tabela nonpartitioned 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 dla tabela partycjonowana przy użyciu kompresji wierszy na wszystkich partycjach plik 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 partycje 2 za pomocą 4 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

Historia zmian

Microsoft Learning

Zaktualizowane definicja IGNORE_DUP_KEY wyjaśnienie, gdy opcja jest skuteczna.