Loading…

READY TO DEAL WITH YOUR DATA?

Get some tips on how to do that!
Start exploring

SQL Server 2014 – Definicje indeksów inline w składni polecenia CREATE TABLE

W trakcie mojej niedawnej prezentacji poświęconej technologii in-memory OLTP w systemie SQL Server 2014 padło pytanie (w pełni zasadne), czy w związku z wprowadzeniem na potrzeby definiowania tabel in-memory możliwości definiowania indeksów inline w składni polecenia CREATE TABLE podobne definiowanie indeksów będzie możliwe dla tradycyjnych tabel. Okazuje się, że tak.

W dokumentacji SQL Server 2014 w części poświęconej nowościom w silniku bazodanowym została wymieniona specyfikacja indeksów (zarówno NONCLUSTERED, jak i CLUSTERED) w definicji tabeli. Jak to wygląda?

Możliwości zdefiniowania indeksu inline w poleceniu CREATE TABLE są dwie. Albo definiujemy indeks zaraz po definicji kolumny, która ma być kluczem indeksu, albo po zdefiniowaniu wszystkich kolumn dopisujemy definicję indeksu. Przykłady poniżej.

Przykład 1

--Przykład 1: Definicje indeksów w ramach definicji kolumn
CREATE TABLE dbo.TestTable (
  c0 int NOT NULL
    CONSTRAINT PK_TestTable PRIMARY KEY NONCLUSTERED,
  c1 int NOT NULL
    INDEX ix1 CLUSTERED (c1, c2),
  c2 int NOT NULL
    INDEX ix2
);

W powyższym przykładzie definicje indeksów znalazły się w obrębie definicji kolumn. Co ciekawe, indeks dopisany obok kolumny nie musi zawierać tej kolumny w swoim kluczu (patrz indeks ix1). Co więcej, definicja kolumny z klucza indeksu może występować w dalszej części definicji tabeli (patrz indeks ix1). Jeśli nie podamy rodzaju indeksu, domyślną wartością jest (oczywiście) NONCLUSTERED (patrz indeks ix2). Jeśli nie podamy kolumn klucza indeksu, będzie on składał się wyłącznie z kolumny, w ramach definicji której indeks został zdefiniowany (dla indeksu ix2 kluczem jest kolumna c2).

Przykład 2

--Przykład 2: Definicje indeksów po definicjach kolumn
CREATE TABLE dbo.TestTable (
  c0 int NOT NULL,
  c1 int NOT NULL,
  c2 int NOT NULL,
  CONSTRAINT PK_TestTable PRIMARY KEY NONCLUSTERED (c0),
  INDEX ix1 CLUSTERED (c0, c2),
  INDEX ix2 (c2)
);

W tym przypadku indeksy zostały zadeklarowane po zdefiniowaniu wszystkich kolumn tabeli. Oczywiście, w takim podejściu podanie listy kolumn określającej klucz indeksu jest obligatoryjne. 

Oba powyższe podejścia można mieszać – w jednym poleceniu CREATE TABLE mogą pojawiać się jednocześnie definicje indeksów inline w ramach definicji kolumn oraz definicje inline indeksów występujące po definicjach kolumn.

Ograniczenia

Definiowanie indeksów inline w kodzie polecenia CREATE TABLE ma swoje ograniczenia:

  • Nie można w ten sposób zdefiniować indeksu unikalnego (oczywiście, zamiast tego można zdefiniować constraint typu UNIQUE lub PRIMARY KEY).
  • Nie można w ten sposób zdefiniować indeksów z klauzulą INCLUDE.
  • Nie można w ten sposób zdefiniować indeksów filtrowanych.

Można za to określać porządek sortowania kolumn (ASC / DESC), określać grupę plików dla indeksu, współczynnik FILLFACTOR czy poziom kompresji (PAGE / ROW / NONE).

Zobacz szczegóły nowej składni polecenia CREATE TABLE w SQL Server 2014

One thought on “SQL Server 2014 – Definicje indeksów inline w składni polecenia CREATE TABLE

  1. Pingback: dotnetomaniak.pl

Leave a Reply