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

Sterta programu SQL Server vs. indeks klastrowy

Przechowywanie sterty nie ma nic wspólnego z tymi stertami .

Sterta oznacza po prostu, że same rekordy nie są uporządkowane (tj. nie są połączone ze sobą).

Kiedy wstawiasz rekord, zostaje on po prostu wstawiony do wolnego miejsca, które znajdzie baza danych.

Aktualizacja wiersza w tabeli opartej na stercie nie wpływa na inne rekordy (chociaż wpływa na indeksy wtórne)

Jeśli utworzysz dodatkowy indeks na HEAP tabela, RID (rodzaj fizycznego wskaźnika do przestrzeni dyskowej) jest używany jako wskaźnik wiersza.

Indeks klastrowy oznacza, że ​​rekordy są częścią B-Tree . Po wstawieniu rekordu B-Tree musi zostać ponownie połączony.

Aktualizacja wiersza w tabeli klastrowej powoduje ponowne połączenie B-Tree, tj. mi. aktualizowanie wewnętrznych wskaźników w innych rekordach.

Jeśli utworzysz indeks pomocniczy w tabeli klastrowej, wartość klucza indeksu klastrowego jest używana jako wskaźnik wiersza.

Oznacza to, że indeks klastrowy powinien być unikalny. Jeśli indeks klastrowy nie jest unikalny, specjalna ukryta kolumna o nazwie uniquifier jest dołączany do klucza indeksu, który sprawia, że ​​jest unikalny (i większy rozmiar).

Warto również zauważyć, że utworzenie indeksu pomocniczego w kolumnie powoduje, że wartości lub klucz indeksu klastrowego stają się częścią klucza indeksu pomocniczego.

Tworząc indeks w tabeli klastrowej, w rzeczywistości zawsze otrzymujesz indeks złożony

CREATE UNIQUE CLUSTERED INDEX CX_mytable_1234 (col1, col2, col3, col4)

CREATE INDEX IX_mytable_5678 (col5, col6, col7, col8)

Indeksuj IX_mytable_5678 jest w rzeczywistości indeksem w następujących kolumnach:

col5
col6
col7
col8
col1
col2
col3
col4

Ma to jeszcze jeden efekt uboczny:

A DESC warunek w indeksie jednokolumnowym w tabeli klastrowanej ma sens w SQL Server

Ten indeks:

CREATE INDEX IX_mytable ON mytable (col1)

może być użyty w zapytaniu takim jak to:

SELECT  TOP 100 *
FROM    mytable
ORDER BY
       col1, id

, podczas gdy ten:

CREATE INDEX IX_mytable ON mytable (col1 DESC)

może być użyty w zapytaniu takim jak to:

SELECT  TOP 100 *
FROM    mytable
ORDER BY
       col1, id DESC


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zapobiegaj wstrzykiwaniu SQL w klauzuli ORDER BY

  2. SqlException (0x80131904):nieprawidłowa nazwa obiektu „dbo.Categories”

  3. Które tabele są bardziej wydajne, CTE czy tymczasowe?

  4. Problem konwersji SQL Nvarchar(255) na DateTime

  5. Niespójne wyniki kursora podczas przechodzenia przez bazy danych