Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Tworzenie indeksu na zmiennej tabeli

Pytanie jest oznaczone jako SQL Server 2000, ale dla dobra osób rozwijających najnowszą wersję zajmę się tym w pierwszej kolejności.

Serwer SQL 2014

Oprócz omówionych poniżej metod dodawania indeksów opartych na ograniczeniach, SQL Server 2014 umożliwia również bezpośrednie określanie nieunikalnych indeksów za pomocą wbudowanej składni w deklaracjach zmiennych tabeli.

Przykładowa składnia jest poniżej.

/*SQL Server 2014+ compatible inline index syntax*/ DECLARE @T TABLE ( C1 INT INDEX IX1 CLUSTERED, /*Single column indexes can be declared next to the column*/ C2 INT INDEX IX2 NONCLUSTERED, INDEX IX3 NONCLUSTERED(C1,C2) /*Example composite index*/ );

Filtrowanych indeksów i indeksów z dołączonymi kolumnami nie można obecnie deklarować z tą składnią, jednak SQL Server 2016 rozluźnia to nieco dalej. Od CTP 3.1 możliwe jest teraz deklarowanie filtrowanych indeksów dla zmiennych tabeli. Według RTM może być w przypadku, gdy dołączone kolumny są również dozwolone, ale aktualna pozycja jest taka, że ​​"prawdopodobnie nie przejdą do SQL16 z powodu ograniczeń zasobów"

/*SQL Server 2016 allows filtered indexes*/
DECLARE @T TABLE
(
c1 INT NULL INDEX ix UNIQUE WHERE c1 IS NOT NULL /*Unique ignoring nulls*/
)
 

SQL Server 2000–2012

Czy mogę utworzyć indeks w nazwie?

Krótka odpowiedź:tak.

DECLARE @TEMPTABLE TABLE (
  [ID]   [INT] NOT NULL PRIMARY KEY,
  [Name] [NVARCHAR] (255) COLLATE DATABASE_DEFAULT NULL,
  UNIQUE NONCLUSTERED ([Name], [ID]) 
  ) 
 

Bardziej szczegółowa odpowiedź znajduje się poniżej.

Tradycyjne tabele w SQL Server mogą mieć indeks klastrowy lub mieć strukturę stert.

Indeksy klastrowane można zadeklarować jako unikatowe, aby uniemożliwić zduplikowane wartości klucza lub domyślnie jako nieunikalne. Jeśli nie jest unikalny, SQL Server dyskretnie dodaje unikatowość do wszystkich zduplikowanych kluczy, aby uczynić je unikalnymi.

Indeksy nieklastrowane można również jawnie zadeklarować jako unikatowe. W przeciwnym razie, w przypadku nieunikatowym, SQL Server dodaje lokalizator wiersza (klastrowy klucz indeksu lub identyfikator RID dla sterty) do wszystkich kluczy indeksu (nie tylko duplikatów), co ponownie zapewnia, że ​​są one unikatowe.

W SQL Server 2000 - 2012 indeksy na zmiennych tabeli można tworzyć tylko niejawnie, tworząc UNIQUE lub PRIMARY KEY ograniczenie. Różnica między tymi typami ograniczeń polega na tym, że klucz podstawowy musi znajdować się w kolumnach nie dopuszczających wartości null. Kolumny uczestniczące w ograniczeniu przez unikalność mogą mieć wartość null. (chociaż implementacja unikalnych ograniczeń SQL Server w obecności NULL s nie jest zgodne ze standardem SQL). Również tabela może mieć tylko jeden klucz podstawowy, ale wiele unikalnych ograniczeń.

Oba te ograniczenia logiczne są fizycznie zaimplementowane z unikalnym indeksem. Jeśli nie określono inaczej, PRIMARY KEY stanie się indeksem klastrowym, a ograniczenia unikatowe nie będą klastrowane, ale to zachowanie można zmienić, określając CLUSTERED lub NONCLUSTERED jawnie z deklaracją ograniczenia (przykładowa składnia)

DECLARE @T TABLE
(
A INT NULL UNIQUE CLUSTERED,
B INT NOT NULL PRIMARY KEY NONCLUSTERED
)
 

W wyniku powyższego następujące indeksy mogą być niejawnie tworzone na zmiennych tabeli w SQL Server 2000 - 2012.

+-------------------------------------+-------------------------------------+
|             Index Type              | Can be created on a table variable? |
+-------------------------------------+-------------------------------------+
| Unique Clustered Index              | Yes                                 |
| Nonunique Clustered Index           |                                     |
| Unique NCI on a heap                | Yes                                 |
| Non Unique NCI on a heap            |                                     |
| Unique NCI on a clustered index     | Yes                                 |
| Non Unique NCI on a clustered index | Yes                                 |
+-------------------------------------+-------------------------------------+
 

To ostatnie wymaga nieco wyjaśnienia. W definicji zmiennej tabeli na początku tej odpowiedzi odpowiedz nieunikalny indeks nieklastrowany na Name jest symulowany przez unikalny indeks na Name,Id (przypomnij sobie, że SQL Server i tak po cichu dodałby klucz indeksu klastrowego do nieunikalnego klucza NCI).

Nieunikalny indeks klastrowy można również uzyskać, ręcznie dodając IDENTITY kolumna, która ma działać jako unikat.

DECLARE @T TABLE
(
A INT NULL,
B INT NULL,
C INT NULL,
Uniqueifier INT NOT NULL IDENTITY(1,1),
UNIQUE CLUSTERED (A,Uniqueifier)
)
 

Nie jest to jednak dokładna symulacja tego, w jaki sposób nieunikalny indeks klastrowy zostałby normalnie zaimplementowany w SQL Server, ponieważ powoduje to dodanie „Uniqueifier” do wszystkich wierszy. Nie tylko te, które tego wymagają.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server:Awaria łącza komunikacyjnego Wymagany SSL (nie udało się odebrać pakietu)

  2. SQL Server:Baza danych utknęła w stanie przywracania

  3. Entity Framework 6 wycofywanie transakcji

  4. Zmienne uwzględniające wielkość liter w SQL Server

  5. SQL Server:Filtruj dane wyjściowe sp_who2