sql >> Database teknologi >  >> RDS >> Sqlserver

Skal jeg indeksere et bitfelt i SQL Server?

Overvej, hvad et indeks er i SQL - og indeks er virkelig en del af hukommelsen, der peger på andre bidder af hukommelsen (dvs. pointere til rækker). Indekset er opdelt i sider, så dele af indekset kan indlæses og fjernes fra hukommelsen afhængigt af brug.

Når du beder om et sæt rækker, bruger SQL indekset til at finde rækkerne hurtigere end ved tabelscanning (ser på hver række).

SQL har klyngede og ikke-klyngede indekser. Min forståelse af klyngede indekser er, at de grupperer lignende indeksværdier på den samme side. På denne måde, når du beder om alle rækkerne, der matcher en indeksværdi, kan SQL returnere disse rækker fra en klynget hukommelsesside. Dette er grunden til, at det er en dårlig idé at prøve at klynge indeksering af en GUID-kolonne - du forsøger ikke at klynge tilfældige værdier.

Når du indekserer en heltalskolonne, indeholder SQLs indeks et sæt rækker for hver indeksværdi. Hvis du har et interval på 1 til 10, vil du have 10 indeksmarkører. Afhængigt af hvor mange rækker der er, kan dette sidestilles forskelligt. Hvis din forespørgsel søger efter indekset, der matcher "1", og derefter hvor Navn indeholder "Fred" (forudsat at Navn-kolonnen ikke er indekseret), henter SQL det sæt af rækker, der matcher "1", meget hurtigt, derefter scanner tabellen for at finde resten.

Så hvad SQL egentlig gør, er at forsøge at reducere arbejdssættet (antal rækker), det skal gentages.

Når du indekserer et bitfelt (eller et snævert område), reducerer du kun arbejdssættet med antallet af rækker, der matcher den værdi. Hvis du har et lille antal rækker, der matcher, vil det reducere dit arbejdssæt meget. For et stort antal rækker med 50/50-fordeling kan det give dig en meget lille præstationsforøgelse i forhold til at holde indekset opdateret.

Grunden til, at alle siger, at de skal teste, er, at SQL indeholder en meget smart og kompleks optimering, der kan ignorere et indeks, hvis den beslutter, at tabelscanning er hurtigere, eller måske bruger en sortering eller organiserer hukommelsessider, som den fandme godt kan lide.



  1. Forbindelse til Db dør efter>4<24 i spring-boot jpa hibernate

  2. Hvad er en relationel database?

  3. mysqli:kan det forberede flere forespørgsler i en erklæring?

  4. Dynamic Sampling Killing Me i 12c