SPRZEDAŻ: 1-800-867-1389
Information
The topic you requested is included in another documentation set. For convenience, it's displayed below. Choose Switch to see the topic in its original location.

Utwórz indeks (języka Transact-SQL)

Tworzy indeks relacyjnej na określoną tabelę lub widok w określonej tabeli. Przed istnieją dane w tabeli, można utworzyć indeks. Relacyjne indeksy mogą być tworzone na tabele lub widoki w innej bazie danych przez określenie nazwy kwalifikowanej bazy danych.

Uwaga Uwaga:

Aby uzyskać informacje o sposobach tworzenia indeksu XML, zobacz Utwórz indeks XML (języka Transact-SQL). Aby uzyskać informacje na temat tworzenia indeksów przestrzennych, zobacz Tworzenie INDEKSU COLUMNSTORE (języka Transact-SQL). Aby uzyskać informacje na temat tworzenia indeksu columnstore, zobacz Utwórz indeks PRZESTRZENNY (języka Transact-SQL).

Ikona łącza do tematu Konwencje składni języka Transact-SQL

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 
}

UNIQUE

Tworzy unikatowy indeks tabeli lub widoku. Unikatowy indeks jest jednym zezwala nie dwa wiersze mają tę samą wartość kluczy indeksu. Indeks klastrowany na widoku musi być unikatowa.

Aparat baz danychNie zezwala na tworzenie unikatowego indeksu w kolumnach, które już zawierać zduplikowane wartości, czy IGNORE_DUP_KEY jest ustawiona na ON. Jeśli ten zostanie podjęta próba, Aparat baz danychwyświetla komunikat o błędzie. Zduplikowane wartości muszą być usunięte przed dla kolumny lub kolumn, można utworzyć indeks unikatowy. Kolumny, które są używane w unikatowy indeks powinna być ustawiona na nie NULL, ponieważ wiele wartości null są uważane za duplikaty, gdy tworzony jest indeks unikatowy.

KLASTROWANY

Tworzy indeks w którym logicznemu porządkowi wartości klucza określa fizyczny porządek odpowiadające im wiersze w tabeli. U dołu lub z liści, poziom indeksu klastrowanego zawiera rzeczywiste dane wierszy tabeli. Tabela lub widok jest dozwolone w jeden indeks klastrowany naraz.

Widok z unikatowego indeksu klastrowanego nosi nazwę widoku indeksowanego. Poniosłaby ta razie tworzenia unikatowego indeksu klastrowanego w widoku fizycznie spełnienia widoku. Unikatowego indeksu klastrowanego należy utworzyć na widok przed pozostałe indeksy mogą być zdefiniowane w tym samym widoku. Aby uzyskać więcej informacji, zobacz Tworzyć widoki indeksowane.

Utwórz indeks klastrowany przed utworzeniem jakichkolwiek indeksów nie klastrowanych. Istniejących indeksów nie klastrowanych w tabelach są przebudowywane podczas tworzenia indeksu klastrowanego.

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

Uwaga Uwaga:

Ponieważ liść indeks klastrowany i stron danych są takie same, z definicji, tworząc indeks klastrowany i przy użyciu ON partition_scheme_namelub na filegroup_nameklauzuli skutecznie przenosi tabelę z grupy plików, na którym została utworzona tabela na nową partycję systemu lub grupa plików. Przed utworzeniem tabel bądź indeksów na konkretnych grup należy sprawdzić które grup są dostępne i mają puste miejsca dla indeksu.

NIEKLASTROWANY

Tworzy indeks, który określa kolejność logiczna tabeli. Z indeks nieklastrowany fizyczny porządek wierszy danych zależy od ich kolejności indeksowane.

Każda tabela może mieć maksymalnie 999 indeksów nie klastrowanych niezależnie od tego, jak są tworzone indeksy: albo pośrednio z kluczem podstawowym i ograniczenie typu UNIQUE, albo jawnie CREATE INDEX.

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

Wartością domyślną jest NONCLUSTERED.

index_name

Nazwa indeksu jest. Nazwy indeksu musi być unikatowa w obrębie tabeli lub widoku, ale nie muszą być unikatowe w obrębie bazy danych. Nazwy indeksu należy przestrzegać zasad identyfikatorów.

column

Jest kolumny lub kolumn, na których oparty jest indeks. Należy określić dwa lub więcej nazwy kolumn, aby utworzyć indeks złożony na wartości połączonych w określonych kolumnach. Lista kolumn, które mają być uwzględnione w indeksie kompozytowe, aby priorytet sortowania, wewnątrz nawiasów po table_or_view_name.

Maksymalnie 16 kolumn mogą być połączone w jeden indeks złożony klucz. Wszystkie kolumny w kluczu kompozytowe indeksu musi być w tej samej tabeli lub widoku. Maksymalny dozwolony rozmiar wartości indeksu połączone jest 900 bajtów.

Kolumny, które są typy danych, wielkiego obiektu (LO) ntext, text, varchar(max), nvarchar(max), varbinary(max), xml, lub imagenie może być określony jako kolumny klucza dla indeksu. Ponadto nie mogą zawierać definicję widoku ntext, text, lub imagekolumny, nawet jeśli nie są one wymienione w instrukcji CREATE INDEX.

Indeksów można tworzyć na kolumny zdefiniowane przez użytkownika typu CLR, jeżeli typ obsługuje binarne zamawiania. Indeksów można również utworzyć na kolumny obliczane, zdefiniowane jako wywołania metody kolumny Typ danych zdefiniowany przez użytkownika, tak długo, jak metody są oznakowane przewidywalne i nie wykonują operacje dostępu danych. Aby uzyskać więcej informacji na temat indeksowania kolumny zdefiniowane przez użytkownika typu CLR, zobacz typy zdefiniowane przez użytkownika CLR.

ASC | OPIS]

Określa rosnąco lub malejąco kierunek sortowania kolumny określonego indeksu. Wartość domyślna to ASC.

INCLUDE (column [ ,... n ] )

Określa kolumny niebędące kluczem do poziomu liścia indeks nieklastrowany. Indeks nieklastrowany może być unikatowy lub nieunikatowy.

Nazwy kolumn nie mogą być powtórzone na liście DOŁĄCZANIA i nie można jednocześnie używać jako zarówno klucz, jak i kolumny niebędące kluczem. Zbudowania indeksów nie klastrowanych zawsze zawierają kolumny indeksu klastrowanego, jeżeli indeks klastrowany jest zdefiniowany w tabeli. Aby uzyskać więcej informacji, zobacz Utworzyć indeksy z uwzględnionych kolumn.

Dozwolone są wszystkie typy danych z wyjątkiem text, ntext, i image. Indeksu musi być utworzony lub przebudowana w trybie offline (ONLINE = OFF) są jednym z określonej kolumny niebędące kluczem varchar(max), nvarchar(max), lub varbinary(max)typy danych.

Obliczone kolumn, które są przewidywalne i dokładne lub niedokładne, mogą być uwzględnione kolumny. Obliczone kolumn pochodnych image, ntext, text, varchar(max), nvarchar(max), varbinary(max), i xmltypów danych mogą być zawarte w kolumny niebędące kluczem, tak długo, jak długo dopuszczalne jako włączone kolumna jest typu danych kolumny obliczanej. Aby uzyskać więcej informacji, zobacz Indeksy na kolumny obliczane.

Aby uzyskać informacje na temat tworzenia indeksu XML, zobacz Utwórz indeks XML (języka Transact-SQL).

GDY <filter_predicate>

Tworzy indeks filtrowane przez określenie wierszy, które w indeksie. Filtrowane indeksu musi być nieklastrowany indeks do tabeli. Tworzy filtrowane statystyki dla wierszy danych w filtrowanym indeksu.

Predykat filtr używa logiki proste porównanie i nie mogą odwoływać się kolumną obliczaną, kolumnę UDT, kolumnę Typ danych przestrzennych lub danych hierarchyID typu kolumny. Porównania za pomocą literałów NULL nie są dozwolone z operatorów porównania. Zamiast używać operatorów IS NULL i IS NOT NULL.

Oto kilka przykładów predykaty filtr dla Production.BillOfMaterialstabeli:

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 dotyczą indeksy XML i indeksy pełnotekstowe. Dla unikatowe indeksy tylko zaznaczone wiersze muszą mieć wartości indeksu unikatowego. Filtrowane indeksów nie pozwalają opcji IGNORE_DUP_KEY.

ON partition_scheme_name(column_name)

Określa schemat partycji, który definiuje grup, na którym będą mapowane partycji indeksu podzielonym na partycje. Schemat partycji musi istnieć w bazie danych wykonując albo Utworzyć PARTYCJĘ systemu lub ALTER PARTYCJI systemu. column_nameOkreśla kolumnę, przeciwko której będzie partycje indeks podzielonym na partycje. Ta kolumna musi odpowiadać typowi danych, długość i dokładność argument partycji funkcji, który partition_scheme_namejest za pomocą. column_namenie jest ograniczone do kolumn w definicji indeksu. Dowolnej kolumny w tabeli bazowej można określić, z wyjątkiem przypadków, gdy podziału indeksu UNIKATOWEGO, column_namenależy wybrać spośród tych, które są używane jako unikatowy klucz. To ograniczenie pozwala Aparat baz danychdo zweryfikowania unikatowości wartości kluczy w obrębie jednej partycji tylko.

Uwaga Uwaga:

Gdy partycja indeks nieunikatowy, klastrowanym, Aparat baz danychdomyślnie dodaje podziału kolumny do listy indeksu klastrowanego klawiszy, jeśli nie jest już określony. Gdy partycjonowanie indeks nieunikatowy, nie klastrowanych, Aparat baz danychdodaje podziału kolumn jako (włączone) kolumna niebędąca kluczem wskaźnika, jeśli nie jest już określony.

Jeśli partition_scheme_namelub filegroupnie zostanie określony i tabeli jest podzielony na partycje, w tym samym systemie partycji, używając tej samej kolumny podziału, jako tabeli źródłowej jest umieszczony indeks.

Uwaga Uwaga:

Nie można określić schemat podziału na indeks XML. Jeśli tabeli bazowej jest podzielony na partycje, indeks XML używa tego samego schematu partycji jako tabela.

Aby uzyskać więcej informacji dotyczących podziału na partycje indeksów Podzielonym na partycje tabel i indeksy.

NAfilegroup_name

Tworzy określony indeks, w określonej grupie plików. Jeśli lokalizacja nie jest określony, a tabela lub widok nie jest partycją, indeks używa tych samych grupa plików jako podstawowej tabeli lub widoku. Grupa plików musi już istnieć.

ON "domyślne"

Tworzy określony indeks domyślnej grupy plików.

Termin domyślnie w tym kontekście nie jest słowem kluczowym. Jest to identyfikator domyślnej grupy plików i musi być rozdzielany, jak w ON "domyślne" lub na domyślne. W przypadku użycia parametru "default" opcja QUOTED_IDENTIFIER musi mieć wartość ON dla bieżącej sesji. Jest to ustawienie domyślne. Aby uzyskać więcej informacji, zobacz SET QUOTED_IDENTIFIER (język Transact-SQL).

[FILESTREAM_ON { filestream_filegroup_name| partition_scheme_name| "NULL" } ]

Określa położenie FILESTREAM dane do tabeli, gdy tworzony jest indeks klastrowany. Klauzula FILESTREAM_ON umożliwia FILESTREAM danych ma zostać przeniesiona do innego systemu grupy plików lub partycji FILESTREAM.

filestream_filegroup_namejest nazwą grupy plików FILESTREAM. Grupa plików musi mieć jeden plik zdefiniowane dla grupy plików za pomocą Tworzenie bazy danych lub ALTER DATABASE instrukcji; w przeciwnym razie błąd zostanie zaokrąglona.

Jeśli tabela jest podzielony na partycje, klauzuli FILESTREAM_ON muszą być włączone oraz należy określić system partycji grup FILESTREAM, która używa tej samej funkcji partycji i kolumny partycji systemu partycji dla tabeli. W przeciwnym razie błąd zostanie zaokrąglona.

Jeśli tabela nie jest podzielony na partycje, nie może być podzielone na partycje kolumny FILESTREAM. FILESTREAM dane w tabeli muszą być przechowywane w jedną grupę plików, określonego w klauzuli FILESTREAM_ON.

FILESTREAM_ON NULL mogą być określone w instrukcji CREATE INDEX indeks klastrowany jest tworzony i tabeli nie zawiera kolumnę FILESTREAM.

Aby uzyskać więcej informacji, zobacz FILESTREAM (SQL Server).

<obiekt>:: =

Jest w pełni kwalifikowana lub nonfully kwalifikowaną obiekt ma być indeksowany.

database_name

Jest nazwą bazy danych.

schema_name

To nazwa schematu, do której należy dany tabeli lub widoku.

table_or_view_name

Jest nazwą tabeli lub widoku mają być indeksowane.

Widok musi być zdefiniowana z SCHEMABINDING do utworzenia indeksu na. Unikatowego indeksu klastrowanego należy utworzyć na widok przed utworzeniem jakichkolwiek indeks nieklastrowany. Aby uzyskać więcej informacji na temat Widoki indeksowane zobacz sekcję Spostrzeżenia.

<relational_index_option>:: =

Określa opcje podczas tworzenia indeksu.

PAD_INDEX = { ON | OFF }

Określa wypełnienie indeksu. Wartość domyślna to OFF.

ON

Procent wolnego miejsca, który zostanie określony przez fillfactorjest stosowana do stron poziom pośredni wskaźnik.

WYŁĄCZANIE lub fillfactornie określono

Strony poziomu pośredniego są wypełnione bliskiej zdolności, pozostawiając wystarczająco dużo miejsca na co najmniej jeden wiersz maksymalny rozmiar indeksu mogą mieć, biorąc pod uwagę zestaw kluczy stronach pośrednich.

PAD_INDEX opcja jest użyteczna tylko wtedy, gdy FILLFACTOR jest określony, ponieważ PAD_INDEX używa wartości procentowej wyszczególnionej przez FILLFACTOR. Jeśli wartość procentową określoną dla FILLFACTOR nie jest wystarczająco duża, aby umożliwić jeden wiersz, Aparat baz danychwewnętrznie przesłonięcia procent umożliwiające minimum. Liczba wierszy na stronę indeksu pośrednie nigdy nie jest mniejsza niż dwa, niezależnie od jak niska wartość 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 danychnależy dokonać poziomu liścia każdej strony indeksu podczas tworzenia indeksu lub odbudować. fillfactormusi mieć wartość całkowitą od 1 do 100. Jeśli fillfactorwynosi 100, Aparat baz danychtworzy indeksy z liści strony wypełnione.

Ustawienie FILLFACTOR dotyczy tylko wtedy, gdy indeks jest tworzony lub przebudowywane. Aparat baz danychJest nie dynamicznie Zachowaj określony procent puste miejsce na stronach. Aby wyświetlić ustawienie współczynnika wypełnienia, użyj sys.indexes katalog widoku.

Ważna informacja Ważne:

Tworzenie indeksu klastrowanego w FILLFACTOR mniej niż 100 wpływa na ilość miejsca na przechowywanie danych zajmuje ponieważ Aparat baz danychrozkłada danych podczas tworzenia indeksu klastrowanego.

Aby uzyskać więcej informacji, zobacz Określ współczynnik wypełnienia dla indeksu.

SORT_IN_TEMPDB = {ON | OFF }

Określa, czy do przechowywania tymczasowego Sortuj wyniki w tempdb. Wartość domyślna to OFF.

ON

Wyniki sortowania pośrednich, które są używane do tworzenia indeksu są przechowywane w tempdb. Może to zmniejszyć czas wymagany do utworzenia indeksu, jeśli tempdb na inny zestaw dysków niż bazy danych użytkowników. Jednakże to zwiększa się ilość miejsca na dysku, który jest używany podczas budowania indeksu.

OFF

Wyniki sortowania pośrednie są przechowywane w tej samej bazie danych jako indeks.

W uzupełnieniu do miejsca wymaganego w bazie użytkowników do tworzenia indeksu tempdb muszą posiadać zasadniczo takie same kwoty dodatkowe miejsce do przechowywania wyników pośrednich sortowania. Aby uzyskać więcej informacji, zobacz SORT_IN_TEMPDB opcja dla indeksów.

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ź na błąd podczas próby operacji wstawienia zduplikowanych wartości kluczy do unikatowego indeksu. Opcja IGNORE_DUP_KEY dotyczy tylko operacji wstawiania po utworzeniu lub przebudowywaniu indeksu. Opcja nie ma wpływu podczas wykonywania CREATE INDEX, ALTER INDEX, lub aktualizacji. Wartość domyślna to OFF.

ON

Komunikat ostrzegawczy nastąpi, gdy zduplikowane wartości kluczy są wstawiane do unikatowego indeksu. Tylko te wiersze, wywierających ograniczenie unikatowości nie powiedzie się.

OFF

Komunikat o błędzie ma miejsce, gdy zduplikowane wartości kluczy są wstawiane do unikatowego indeksu. Cała operacja WSTAWIANIA identyfikator_transakcji wycofuje.

IGNORE_DUP_KEY nie można ustawić ON indeksy utworzone na widok, nieunikatowe indeksy, indeksy XML, indeksy przestrzenne i filtrowane indeksy.

Aby wyświetlić IGNORE_DUP_KEY, użyj 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 statystyka dystrybucji jest ponownie obliczana. Wartość domyślna to OFF.

ON

Nieaktualne statystyki nie są automatycznie przeliczane.

OFF

Statystyka automatyczne aktualizowanie są włączone.

Aby przywrócić Statystyka automatyczne aktualizowanie, ustaw STATISTICS_NORECOMPUTE OFF, lub wykonywania aktualizacji statystyk bez klauzuli NORECOMPUTE.

Ważna informacja Ważne:

Wyłączanie automatycznego recomputation statystyk dystrybucji może zapobiec Optymalizator kwerend od pobrania optymalnej realizacji planów kwerend obejmujących tabeli.

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 spadły i odbudowana. Wartość domyślna to OFF.

ON

Istniejący indeks jest opuszczane, a odbudowane. Nazwa indeksu określone muszą być takie same jak obecnie istniejący indeks; Jednakże definicji indeksu mogą być modyfikowane. Na przykład można określić, różnych kolumn, porządek sortowania, partycji systemu lub Opcje wskaźnika.

OFF

Błąd jest wyświetlana, 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 podczas operacji indeksowania źródłowe tabele i skojarzone z nimi indeksy są dostępne dla zapytań i operacji modyfikowania danych. Wartość domyślna to OFF.

Uwaga Uwaga:

Operacje indeksów online nie są dostępne w każdym wydaniu Microsoft SQL Server. Aby uzyskać listę funkcji, które są obsługiwane przez wersje SQL Server, zobacz Funkcje obsługiwane przez poszczególne wersje programu SQL Server 2012.

ON

Długoterminowe blokady tabeli nie obowiązują podczas operacji indeksowania. W głównej fazie indeksowania tabela źródłowa podlega wyłącznie blokadzie Zamiar współużytkowania (IS). Dzięki temu kwerend lub aktualizacjach do podległej tabeli i indeksy, aby kontynuować. Na początku operacji blokady współużytkowane (S) znajdują się w obiekcie źródłowym przez bardzo krótki okres czasu. Na końcu operacji na krótki okres czasu Zablokuj S (Shared) został nabyty w źródle, jeśli tworzony jest indeks nieklastrowany; lub Zablokuj SCH-M (modyfikacja schematu) jest nabyte podczas indeks klastrowany utworzenie lub porzucone w trybie online i indeks klastrowany lub nieklastrowany są przebudowywane. Dla opcji ONLINE nie można ustawić wartości ON, jeśli tworzony indeks dotyczy lokalnej tabeli tymczasowej.

OFF

Blokady tabeli są stosowane podczas operacji indeksowania. Operacja indeksowania w trybie offline, która skutkuje utworzeniem, odbudowaniem lub usunięciem indeksu klastrowanego albo odbudowaniem lub usunięciem indeksu nieklastrowanego, powoduje nałożenie na źródłową tabelę blokady Modyfikacja schematu (Sch-M). Taka blokada zapobiega wszelkiemu dostępowi użytkowników do tabeli przez cały czas trwania operacji. Operacja indeksowania w trybie offline, która skutkuje utworzeniem indeksu nieklastrowanego, nakłada na tabelę blokadę Współużytkowanie (S). Ta blokada uniemożliwia aktualizowanie tabeli, ale pozwala na operacje odczytu, np. wykonywanie instrukcji SELECT.

Aby uzyskać więcej informacji, zobacz W jaki sposób Online operacji indeksu pracy.

Indeksy, włączając indeksów na globalne tabel temp, mogą być tworzone online z następującymi wyjątkami:

  • XML indeksu

  • Indeks w lokalnej tabeli.

  • Początkowe unikatowego indeksu klastrowanego w widoku.

  • Indeksy klastrowane wyłączone.

  • Indeks klastrowany jeśli podstawowa tabela zawiera typy danych LOB: image, ntext, textoraz typy przestrzennych.

Aby uzyskać więcej informacji, zobacz Wykonywanie operacji indeksu Online.

ALLOW_ROW_LOCKS = { ON | OFF }

Określa, czy blokady wierszy są dozwolone. Ustawienie domyślne to ON.

ON

Wiersz blokady są dozwolone podczas uzyskiwania dostępu do indeksu. Aparat baz danychOkreśla, kiedy są używane wiersz blokad.

OFF

Wiersz blokady nie są używane.

ALLOW_PAGE_LOCKS = { ON | OFF }

Określa, czy blokady stron są dozwolone. Ustawienie domyślne to ON.

ON

Blokady strony są dozwolone podczas uzyskiwania dostępu do indeksu. Aparat baz danychOkreśla, kiedy są używane strony blokad.

OFF

Strona blokady nie są używane.

MAXDOP = max_degree_of_parallelism

Zastępuje Skonfigurować maksymalny stopień paralelizm opcji konfiguracji serweraopcji konfiguracji na czas trwania operacji indeks. Użyj MAXDOP aby ograniczyć liczbę procesorów używanych w realizacji planu równoległego. Maksymalna wartość to 64 procesory.

max_degree_of_parallelismmoże być:

1

Powoduje pomijanie generowania planu operacji równoległych.

>1

Ogranicza maksymalną liczbę procesorów używanych w operacji równoległych indeksu do określonej liczby lub mniej na podstawie bieżącego obciążenia systemu.

0 (wartość domyślna)

Powoduje użycie faktycznej lub mniejszej liczby procesorów, zależnie od aktualnego obciążenia komputera.

Aby uzyskać więcej informacji, zobacz temat Konfigurowanie równolegle operacji indeksu.

Uwaga Uwaga:

Operacji równoległych indeksu nie są dostępne w każdym wydaniu Microsoft SQL Server. Aby uzyskać listę funkcji, które są obsługiwane przez wersje SQL Server, zobacz Funkcje obsługiwane przez poszczególne wersje programu SQL Server 2012.

DATA_COMPRESSION

Określa opcję kompresji danych określony indeks, numer partycji lub zakres partycji. Dostępne są następujące opcje:

NONE

Indeks lub określonej partycji nie są kompresowane.

ROW

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

PAGE

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

Aby uzyskać więcej informacji na temat kompresji, zobacz Kompresja danych.

NA PARTYCJACH ( { <partition_number_expression> | <range> } [ ,...n ] )

Określa partycje, do których stosuje się ustawienie DATA_COMPRESSION. Jeśli indeks nie jest podzielony na partycje, argument na PARTYCJE wygeneruje błąd. Jeśli nie podano klauzuli na PARTYCJE, opcja DATA_COMPRESSION stosuje się do wszystkich partycji indeksu podzielonym na partycje.

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

  • Podać numer dla partycji, na przykład: na PARTYCJI (2).

  • Podać numery partycji dla kilku partycji poszczególnych oddzielonych przecinkami, na przykład: na PARTYCJI (1, 5).

  • Zapewnić zarówno zakresów, jak i poszczególnych partycji, na przykład: na PARTYCJI (2, 4, 6-8).

<zakres> może być określona jako partycja liczb oddzielonych wyraz, na przykład: na PARTYCJI (6-8).

Aby ustawić różne typy kompresji danych dla różnych partycji, 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)
)
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)
)

Instrukcja CREATE INDEX jest zoptymalizowana pod kątem jak inne kwerendy. Aby zapisać na operacje we/wy, procesor kwerend może wybrać opcję skanowania innego indeksu, zamiast wykonywania skanowanie tabeli. Operację sortowania może być wyeliminowana w niektórych sytuacjach. Na komputerach wieloprocesorowych CREATE INDEX można użyć więcej procesorów do skanowania i sortować operacje związane z tworzeniem indeksu, w taki sam sposób, jak inne kwerendy. Aby uzyskać więcej informacji, zobacz Konfigurowanie równolegle operacji indeksu.

Operacja tworzenia indeksu można minimalny rejestrowane, modelu odzyskiwania bazy danych ustawiono bulk-logged lub proste.

Indeksy mogą być tworzone na tabeli tymczasowej. Po upuszczeniu tabeli lub kończy sesję, indeksy są opuszczane.

Indeksy obsługują właociwooci rozszerzonych.

Indeksy klastrowane

Tworzenie indeksu klastrowanego w tabeli (sterty) lub przerywanie i odtwarzania istniejący indeks klastrowany wymaga dodatkowego obszaru roboczego mają być dostępne w bazie danych do sortowania danych i tymczasowej kopii pierwotnej tabeli lub istniejące dane indeksu klastrowanego. Aby uzyskać więcej informacji na temat indeksy klastrowane, zobacz Utworzyć indeksy klastrowane.

Unikatowe indeksy

Gdy istnieje unikatowy indeks, Aparat baz danychkontroli dla duplikat wartości każdego danych czasu jest dodane przez operacje wstawiania. Operacje wstawiania, które wygenerowało zduplikowane wartości kluczy są proporcjonalnie wycofana, a Aparat baz danychwyświetla komunikat o błędzie. To prawda, nawet jeśli operacja wstawiania zmiany wielu wierszy, ale powoduje tylko jednego duplikatu. Jeśli próby wprowadzania danych, dla których jest unikatowy indeks, a klauzula IGNORE_DUP_KEY jest ustawiona na ON, tylko te wiersze, wywierających niepowodzenie indeks unikatowy.

Indeksy podzielonym na partycje

Indeksy podzielonym na partycje są tworzone i utrzymywane w sposób podobny do tabel podzielonym na partycje, ale jak zwykłe indeksów, są traktowane jako oddzielne obiekty. Można mieć podzielonym na partycje indeks dla tabeli, która nie podzielony na partycje, i może mieć nonpartitioned indeks dla tabeli, która jest podzielony na partycje.

Jeśli tworzysz indeks dla tabeli, podzielone na partycje, a nie określić grupę plików, w którym należy umieścić wskaźnik indeks jest podzielony na partycje w taki sam sposób jak tabeli podstawowej. Jest to spowodowane indeksów, domyślnie są umieszczane na tych samych grup co ich tabelach, podzielone na partycje tabeli w tym samym systemie partycji korzystającym z tego samego podziału kolumn. Gdy indeks używa tego samego schematu partycji i podziału kolumn w tabeli, indeksu jest wyrównany do z tabelą.

Przestroga Przestroga

Tworzenie i Odbudowa indeksów nonaligned dla tabeli zawierającej więcej niż 1000 partycji jest możliwe, ale nie jest obsługiwany. To może spowodować pogorszenie wydajności lub pamięci nadmiernego zużycia podczas tych czynności. Zaleca się tylko przy użyciu wyrównany indeksów, gdy liczba partycji przekracza 1000.

Gdy partycjonowanie indeks nieunikatowy, klastrowanym, Aparat baz danychdomyślnie dodaje podziału kolumn do listy indeksu klastrowanego klawiszy, jeśli nie zostały jeszcze określone.

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

W SQL Server 2012, statystyki nie są tworzone przez skanowanie wszystkich wierszy w tabeli, gdy indeks podzielonym na partycje jest tworzony lub przebudowywane. Zamiast tego Optymalizator kwerend używa domyślny algorytm pobierania próbek do generowania statystyk. Uzyskanie Statystyka podzielonym na partycje indeksów przez skanowanie wszystkich wierszy w tabeli, należy użyć tworzenie statystyk lub aktualizacji statystyk z klauzulą FULLSCAN.

Filtrowane indeksy

Filtrowane indeks jest zoptymalizowanym indeksem nie klastrowanych, dopasowane do kwerend, które wybierz niewielki procent wierszy z tabeli. Predykat filtr używa do indeksu część danych tabeli. Dobrze indeks filtrowane można poprawić wydajność kwerendy, zmniejszyć koszty składowania i zmniejszenia kosztów utrzymania.

Ustawianie opcji wymagane dla filtrowanego indeksów

ZESTAW opcji Required Valuekolumny są wymagane, jeśli wystąpi którykolwiek z następujących warunków:

  • Utwórz indeks filtrowane.

  • INSERT, UPDATE, DELETE, lub operacji scalania modyfikującą dane filtrowane indeksu.

  • Optymalizator kwerend używa indeksu filtrowane plan wykonania kwerend.

    Ustawianie opcji

    Wymagane wartości

    ANSI_NULLS

    ON

    ANSI_PADDING

    ON

    ANSI_WARNINGS *

    ON

    ARITHABORT

    ON

    CONCAT_NULL_YIELDS_NULL

    ON

    NUMERIC_ROUNDABORT

    OFF

    QUOTED_IDENTIFIER

    ON

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

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

  • Filtrowane indeks nie jest tworzony.

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

  • Optymalizator kwerend nie należy rozważyć indeks w plan realizacji wszelkich instrukcji Transact-SQL.

Aby uzyskać więcej informacji na temat filtrowania indeksów, zobacz Tworzenie indeksów filtrowane.

Indeksy przestrzenne

Indeksy XML

Dla informacji na temat formatu XML, indeksy zobacz, Utwórz indeks XML (języka Transact-SQL)i Indeksy XML (SQL Server).

Rozmiar klucza indeksu

Maksymalny rozmiar klucza indeks wynosi 900 bajtów. Indeksy na varcharkolumny, które przekraczają 900 bajtów mogą być tworzone, jeśli istniejące dane w kolumnach nie przekraczają 900 bajtów w czasie, gdy tworzony jest indeks; jednak kolejne insert lub update actions w kolumnach, które powodują całkowity rozmiar większy niż 900 bajtów zakończy się niepowodzeniem. Klucz indeksu klastrowanego indeksu nie może zawierać varcharkolumny, które mają istniejących danych w alokacji ROW_OVERFLOW_DATA jednostkę Jeżeli indeks klastrowany zostanie utworzona w varcharkolumny i istniejących danych znajduje się w jednostce alokacji IN_ROW_DATA, kolejne insert lub update actions w kolumnie, która doprowadziłaby wyłączyć wiersz danych zakończy się niepowodzeniem.

Zbudowania indeksów nie klastrowanych może zawierać kolumny niebędące kluczem na poziomie liścia indeksu. Kolumny te nie są uważane przez Aparat baz danychprzy obliczaniu rozmiaru klucza indeks. Aby uzyskać więcej informacji, zobacz Utworzyć indeksy z uwzględnionych kolumn.

Uwaga Uwaga:

Jeśli tabele są podzielone na partycje, jeśli podziału kolumn klucza nie są jeszcze obecne w nieunikatowy indeks klastrowany, są dodawane do indeksu przez Aparat baz danych. Łączny rozmiar kolumn indeksowanych (nie licząc dołączone kolumny), powiększonej o wszelkie dodane podziału kolumn nie może przekraczać 1800 bajtów nieunikatowy indeks klastrowany.

Kolumny obliczane

Indeksy mogą być tworzone na kolumny obliczane. Ponadto obliczanej kolumny może mieć właściwości PERSISTED. Oznacza to, że Aparat baz danychprzechowuje obliczone wartości w tabeli i aktualizuje je po zaktualizowaniu innych kolumn, od których zależy kolumny obliczanej. Aparat baz danychUżywa tych utrwalonej wartości, gdy tworzy indeks jednokolumnowy i gdy indeks jest określany w kwerendzie.

Aby indeksować kolumny obliczanej, kolumny obliczanej musi przewidywalne i dokładne. Jednakże za pomocą właściwości PERSISTED rozszerza typu Indeksowalny obliczanej kolumny mają zostać uwzględnione:

  • Obliczone kolumn na podstawie Transact-SQLi CLR funkcje, jak i metody zdefiniowane przez użytkownika typu CLR, które są oznaczone deterministyczny przez użytkownika.

  • Obliczane kolumny oparte na wyrażeniach, które są przewidywalne, zgodnie z definicją Aparat baz danychale nieprecyzyjne.

Utrwalonej kolumny obliczane wymagają ustaw opcje, aby ustawić, jak pokazano w poprzedniej sekcji „wymagane ustaw opcje dla indeksowane widoki".

Ograniczenie UNIQUE lub klucz podstawowy może zawierać kolumną obliczaną, tak długo, jak długo spełnia wszystkie warunki do indeksowania. W szczególności kolumny obliczanej muszą być przewidywalne i dokładne lub deterministyczny oraz utrwalonej. Aby uzyskać więcej informacji dotyczących determinizmu, zobacz temat Przewidywalne i wywołaniach funkcji.

Obliczone kolumn pochodnych image, ntext, text, varchar(max), nvarchar(max), varbinary(max), i xmldane typy mogą być indeksowane, albo jako kolumna niebędąca kluczem klucza lub włączone tak długo, jak typ danych kolumny obliczanej jest dopuszczalne jako kolumnę klucza indeksu lub kolumna niebędąca kluczem. Na przykład, nie można utworzyć podstawowy indeksu XML na obliczanej xmlkolumny. Jeśli rozmiar klucza indeksu przekracza 900 bajtów, wyświetlany jest komunikat ostrzegawczy.

Tworzenie indeksu dla kolumny obliczanej może spowodować uszkodzenie instrukcji insert lub zaktualizować operacji, który pracował wcześniej. Takiej awarii może mieć miejsce, gdy kolumny obliczanej wyników w arytmetyczną błąd. Na przykład w poniższej tabeli chociaż obliczane kolumny cwyników w arytmetyczną błąd, INSERTinstrukcji dzieła.

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

Jeśli po utworzeniu tabeli, można natomiast utworzyć indeks w kolumnie obliczanej c, tym samym INSERTinstrukcji teraz zakończy 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);
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 Indeksy na kolumny obliczane.

Uwzględnionych kolumn w indeksach

Kolumny non klucz, nazywany uwzględnionych kolumn, można dodać do poziomu liścia indeks nieklastrowany aby poprawić wydajność kwerendy poprzez objęcie kwerendy. Oznacza to, że wszystkie kolumny w kwerendzie są zawarte w indeksie jako klucz lub kolumny niebędące kluczem. Pozwala to Optymalizator kwerend zlokalizować wszystkie wymagane informacje od skanowanie indeksu; indeks klastrowany danych lub tabeli nie jest dostępne. Aby uzyskać więcej informacji, zobacz Utworzyć indeksy z uwzględnionych kolumn.

Określanie opcji indeksu

SQL Server 2005wprowadzonego indeks nowe opcje i również modyfikuje sposób, w jaki zostaną określone opcje. W Składnia zgodna z poprzednimi wersjami z option_namejest równoważne z (<option_name>= ON ). Po ustawieniu opcji indeksu, stosuje się następujące zasady:

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

  • Opcji nie można określić przy użyciu zarówno wstecz Składnia zgodna i nowe w tej instrukcji. Na przykład, określając z (DROP_EXISTING, ONLINE = ON) powoduje, że oświadczenie nie powiedzie się.

  • Podczas tworzenia indeksu XML, opcje należy określić korzystając z (option_name= ON | OFF).

Klauzula DROP_EXISTING

Za pomocą klauzuli DROP_EXISTING aby odbudować indeks, dodać lub upuszczania kolumn, modyfikowania opcji, modyfikować kolejność sortowania kolumn lub zmienić partycji systemu lub grupa plików.

Jeśli indeks wymusza ograniczenie klucza podstawowego lub UNIQUE i definicji indeksu nie jest zmieniany w jakikolwiek sposób, indeks jest odrzucany i odtwarzane, zachowując istniejące ograniczenia. Jednakże jeżeli zmieniana definicji indeksu, ulegnie awarii instrukcji. Aby zmienić definicję klucz podstawowy lub ograniczenie typu UNIQUE, upuść ograniczenie i dodać ograniczenia z nowej definicji.

DROP_EXISTING zwiększa wydajność, gdy ponownie indeks klastrowany, z tego samego lub innego zestawu kluczy, dla tabeli, która ma również indeksów nie klastrowanych. DROP_EXISTING zastępuje wykonanie instrukcji DROP INDEKSU na stary indeks klastrowany następuje wykonanie instrukcji CREATE INDEX dla nowego indeksu klastrowanego. Odbudowa indeksów nie klastrowanych raz, a następnie tylko wtedy, gdy zmienił definicji indeksu. Klauzula DROP_EXISTING nie odbudować indeksów nie klastrowanych, gdy definicja indeksu tej samej nazwy indeksu, klucz i partycji kolumn, unikatowości atrybutu i porządek sortowania jako oryginalny indeksu.

Czy indeksów nie klastrowanych są przebudowywane lub nie, one zawsze pozostać w ich oryginalnym grup lub partycji systemów i będzie używać oryginalnej funkcji partycji. Jeżeli indeks klastrowany jest odbudowywany na różne grupy plików lub partycji systemu, indeksów nie klastrowanych nie są przenoszone do zbiegać się z nową lokalizację indeksu klastrowanego. W związku z tym, nawet indeksów nie klastrowanych wcześniej wyrównane z indeksem klastrowanym, nie może być dostosowane z nim. Aby uzyskać więcej informacji o wyrównanie podzielonym na partycje indeksu zobacz.

Klauzula DROP_EXISTING nie posortuje dane ponownie jeśli te same kolumny kluczy indeksu są używane w tej samej kolejności i z tym samym rosnąco lub malejąco, chyba że instrukcji index określa indeks nieklastrowany i opcji ONLINE jest ustawiony na wyłączone. Jeżeli indeks klastrowany zostanie wyłączona, należy wykonać operacji tworzenia INDEKSU Z DROP_EXISTING z ONLINE ustawiona na OFF. Jeśli indeks nieklastrowany jest wyłączone i nie jest związana z indeksem klastrowanym niepełnosprawnych, operacji tworzenia INDEKSU Z DROP_EXISTING mogą być wykonywane z ONLINE ustawiony na wyłączone lub na.

Indeksy z zakresów 128 lub więcej są opuszczane lub przebudowany, Aparat baz danychpodporządkowuje deallocations rzeczywiste strony i ich skojarzone blokad, do czasu po zatwierdzeniu transakcji.

Opcja ONLINE

Poniższe wytyczne dotyczą wykonywania operacji indeksu online:

  • Podległej tabeli nie zmienione, obcięta lub opuszczone podczas operacji indeksów online jest w procesie.

  • Dodatkowe tymczasowego miejsca jest wymagana podczas operacji indeksu.

  • Online czynności mogą być wykonywane na indeksy podzielonym na partycje i indeksy, które zawierają utrwalone kolumny obliczane lub uwzględnione kolumny.

Aby uzyskać więcej informacji, zobacz Wykonywanie operacji indeksu Online.

Wiersz i opcje blokad strony

Gdy ALLOW_ROW_LOCKS = ON i ALLOW_PAGE_LOCK = ON, wiersz-, Strona-, i poziomu tabel blokad są dozwolone podczas uzyskiwania dostępu do indeksu. Aparat baz danychWybiera odpowiedni blokady i może eskalować blokady z zamkiem wiersza lub strony blokady tabeli.

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

Wyświetlanie informacji o indeksie

Zwraca informacje o indeksach, można użyć katalogu widoki, funkcje systemu i systemu procedur przechowywanych.

Kompresja danych

Kompresja danych jest opisany w temacie Kompresja danych. Kluczowe punkty do rozważenia są następujące:

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

  • Nie liściu stron indeksu nie są strony skompresowane, ale może być kompresowane wiersz.

  • Każdy indeks nieklastrowany ma ustawienie poszczególnych kompresji, a nie dziedziczą ustawienia kompresji tabeli podstawowej.

  • Po utworzeniu indeksu klastrowanego w sterty indeks klastrowany dziedziczy stanu kompresji sterty chyba, że określono alternatywnych kompresję.

Podzielonym na partycje indeksów, obowiązują następujące ograniczenia:

  • Nie można zmienić ustawienia kompresji dla wybranej partycji, jeśli tabela ma niewyrównane indeksy.

  • Wskaźnik zmienia <indeksu> ... ODBUDUJ PARTYCJI... Składnia odbudowuje określonej partycji indeksu.

  • Wskaźnik zmienia <indeksu> ... ODBUDOWANIA Z... Składnia odtwarza wszystkie partycje indeksu.

Do oceny spodziewanego wpływu stanu kompresji na tabelę, indeks lub partycję służy procedura składowana sp_estimate_data_compression_savings.

Wymaga ALTER uprawnienia w tabeli lub widoku. Użytkownik musi być członkiem sysadmin roli serwera stałych lub db_ddladmin i db_owner stałe role bazy danych.

A.Tworzenie prostych indeks nieklastrowany

Poniższy przykład tworzy indeks nieklastrowany na VendorIDkolumny z Purchasing.ProductVendor tabeli.

USE AdventureWorks2012;
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 indeks nieklastrowany złożonych na SalesQuotai SalesYTD kolumny Sales.SalesPersontabeli.

USE AdventureWorks2012
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 unikatowy indeks nieklastrowany

Poniższy przykład tworzy unikatowy indeks nieklastrowany na Namekolumny z Production.UnitMeasuretabeli. Indeks będzie wymuszać unikatowość dane umieszczone na Namekolumny.

USE AdventureWorks2012;
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 badania ograniczenie unikatowości przez próbujesz wstawić wiersz z taką samą wartość jak w 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());
--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());

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.
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 wpływ IGNORE_DUP_KEYopcji przez wstawianie wielu wierszy w tabeli tymczasowej najpierw z opcję ONi ponownie opcję OFF. Pojedynczy wiersz jest wstawiany do #Testtabeli, który celowo spowoduje duplikat wartości w momencie gdy drugi wiersz wiele INSERTinstrukcji. Liczba wierszy w tabeli zwraca liczbę wierszy dodaje.

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
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

Oto wyniki drugiego INSERTinstrukcji.

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

Number of rows 
-------------- 
38
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.UnitMeasuretabeli, która nie naruszają ograniczenia unikatowości zostały pomyślnie wstawione. Wydano ostrzeżenie zduplikowany wiersz ignorowane, a cała transakcja nie była identyfikator_połączenia wycofuje.

Te same instrukcje wykonywane są ponownie, ale z IGNORE_DUP_KEYustawiony na 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
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

Oto wyniki drugiego INSERTinstrukcji.

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
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

Zawiadomienie to brak wierszy z Production.UnitMeasuretabeli zostały wstawione do tabeli, nawet jeśli tylko jeden wiersz w tabeli naruszone UNIQUEindeks ograniczenie.

E.Upuść i ponownie utworzyć indeks za pomocą DROP_EXISTING

W poniższym przykładzie spadnie i odtwarza istniejący indeks na ProductIDkolumny z Production.WorkOrdertabeli za pomocą DROP_EXISTINGopcji. Opcje FILLFACTORi PAD_INDEXsą również ustawić.

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


F.Tworzenie indeksu na widoku

Poniższy przykład tworzy widok i indeks w tym widoku. Włącza się dwie kwerendy używające widoku indeksowanego.

USE AdventureWorks2012;
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ędnionych kolumn (bez klucza)

Poniższy przykład tworzy indeks nieklastrowany z jednej kolumny klucza (PostalCode) oraz cztery kolumny niebędące kluczem (AddressLine1, AddressLine2, City, StateProvinceID). Kwerendy, która jest objęta następujące indeksu. Aby wyświetlić indeksu wybranego przez optymalizator kwerend na kwerendy menu w SQL Server Management Studio, zaznacz Wyświetlać rzeczywiste Plan realizacji przed wykonaniem kwerendy.

USE AdventureWorks2012;
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 indeksu podzielonym na partycje

Poniższy przykład tworzy indeks nieklastrowany podzielonym na partycje na TransactionsPS1, istniejącego programu partycji. W tym przykładzie założono, że próbki podzielonym na partycje indeks został zainstalowany.

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
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

Poniższy przykład tworzy indeks filtrowane w tabeli Production.BillOfMaterials. Predykat filtr może zawierać kolumny, które nie są kolumny klucza w filtrowanym indeksu. Predykat w tym przykładzie wybiera tylko te wiersze, gdzie EndDate jest NIEZEROWA.

USE AdventureWorks2012;
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 skompresowanych indeksu

Poniższy przykład tworzy indeks w nonpartitioned tabeli przy użyciu kompresji wiersza.

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

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

Poniższy przykład tworzy indeks w podzielonym na partycje tabeli przy użyciu kompresji wiersza na wszystkich partycjach indeksu.

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

Poniższy przykład tworzy indeks dla tabeli, podzielone na partycje przy użyciu kompresji strony na partycji 1kompresji indeksu i wierszy na partycjach 2przez 4indeksu.

CREATE CLUSTERED INDEX IX_PartTab2Col1
ON PartitionTable1 (Col1)
WITH (DATA_COMPRESSION = PAGE ON PARTITIONS(1),
    DATA_COMPRESSION = ROW ON PARTITIONS (2 TO 4 ) ) ;
GO
CREATE CLUSTERED INDEX IX_PartTab2Col1
ON PartitionTable1 (Col1)
WITH (DATA_COMPRESSION = PAGE ON PARTITIONS(1),
    DATA_COMPRESSION = ROW ON PARTITIONS (2 TO 4 ) ) ;
GO
Czy oceniasz te materiały jako pomocne?
(Pozostało znaków: 1500)
Dziękujemy za opinię.

Zawartość społeczności

Pokaż:
© 2014 Microsoft