sql >> Databasteknik >  >> RDS >> Sqlserver

SQL Server-index - stigande eller fallande, vilken skillnad gör det?

Detta har främst betydelse när det används med sammansatta index:

CREATE INDEX ix_index ON mytable (col1, col2 DESC);

kan användas för antingen:

SELECT  *
FROM    mytable
ORDER BY
        col1, col2 DESC

eller:

SELECT  *
FROM    mytable
ORDER BY
        col1 DESC, col2

, men inte för:

SELECT  *
FROM    mytable
ORDER BY
        col1, col2

Ett index på en enda kolumn kan effektivt användas för sortering på båda sätt.

Se artikeln i min blogg för detaljer:

  • Fallande index

Uppdatering:

Faktum är att detta kan ha betydelse även för ett enda kolumnindex, även om det inte är så uppenbart.

Föreställ dig ett index på en kolumn i en klustrad tabell:

CREATE TABLE mytable (
       pk INT NOT NULL PRIMARY KEY,
       col1 INT NOT NULL
)
CREATE INDEX ix_mytable_col1 ON mytable (col1)

Indexet på col1 behåller ordnade värden för col1 tillsammans med referenserna till rader.

Eftersom tabellen är klustrad är referenserna till rader faktiskt värdena för pk . De är också ordnade inom varje värde för col1 .

Detta betyder att bladen i indexet faktiskt är ordnade på (col1, pk) , och denna fråga:

SELECT  col1, pk
FROM    mytable
ORDER BY
        col1, pk

behöver ingen sortering.

Om vi ​​skapar indexet enligt följande:

CREATE INDEX ix_mytable_col1_desc ON mytable (col1 DESC)

, sedan värdena för col1 kommer att sorteras fallande, men värdena för pk inom varje värde för col1 kommer att sorteras stigande.

Det betyder att följande fråga:

SELECT  col1, pk
FROM    mytable
ORDER BY
        col1, pk DESC

kan betjänas av ix_mytable_col1_desc men inte av ix_mytable_col1 .

Med andra ord, kolumnerna som utgör ett CLUSTERED INDEX i vilken tabell som helst finns alltid de avslutande kolumnerna för alla andra index i den tabellen.



  1. Hur kan jag ställa in en String[]-parameter till en inbyggd fråga?

  2. Hur man använder MELLAN-operatören i SQL Server

  3. "Dödligt fel på intern anslutning" vid exekvering av en inbyggt kompilerad lagrad procedur i SQL Server 2019 (känd bugg)

  4. mysql fulltextsökning misslyckades