sql >> Database >  >> RDS >> Sqlserver

SQL Server-heap vs. geclusterde index

Heap-opslag heeft niets te maken met deze hopen .

Heap betekent alleen dat records zelf niet geordend zijn (d.w.z. niet aan elkaar gekoppeld).

Wanneer u een record invoegt, wordt het gewoon ingevoegd in de vrije ruimte die de database vindt.

Het bijwerken van een rij in een op heap gebaseerde tabel heeft geen invloed op andere records (hoewel het wel van invloed is op secundaire indexen)

Als u een secundaire index maakt op een HEAP tabel, de RID (een soort fysieke aanwijzer naar de opslagruimte) wordt gebruikt als rijaanwijzer.

Geclusterde index betekent dat de records onderdeel zijn van een B-Tree . Wanneer u een record invoegt, wordt de B-Tree moet opnieuw worden gekoppeld.

Het bijwerken van een rij in een geclusterde tabel veroorzaakt het opnieuw koppelen van de B-Tree, i. e. interne verwijzingen in andere records bijwerken.

Als u een secundaire index maakt op een geclusterde tabel, wordt de waarde van de geclusterde indexsleutel gebruikt als rijaanwijzer.

Dit betekent dat een geclusterde index uniek moet zijn. Als een geclusterde index niet uniek is, een speciale verborgen kolom genaamd uniquifier wordt toegevoegd aan de indexsleutel die maakt indien uniek (en groter in omvang).

Het is ook vermeldenswaard dat het maken van een secundaire index op een kolom ervoor zorgt dat de waarden of de sleutel van de geclusterde index deel uitmaken van de sleutel van de secundaire index.

Door een index op een geclusterde tabel te maken, krijg je in feite altijd een samengestelde index

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

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

Index IX_mytable_5678 is in feite een index op de volgende kolommen:

col5
col6
col7
col8
col1
col2
col3
col4

Dit heeft nog een bijwerking:

Een DESC voorwaarde in een index met één kolom op een geclusterde tabel is logisch in SQL Server

Deze index:

CREATE INDEX IX_mytable ON mytable (col1)

kan worden gebruikt in een zoekopdracht als deze:

SELECT  TOP 100 *
FROM    mytable
ORDER BY
       col1, id

, terwijl deze:

CREATE INDEX IX_mytable ON mytable (col1 DESC)

kan worden gebruikt in een zoekopdracht als deze:

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


  1. Syntaxisfout in Postgres-droptabel

  2. Mysql hoofdlettergevoelig maken?

  3. Nieuwe instantie van MySQL instellen wat is het huidige rootwachtwoord?

  4. Is het mogelijk om `SqlDbType.Structured` te gebruiken om tabelwaardeparameters in NHibernate door te geven?