Av: Ben Snaidero
Oversikt
I denne delen vil vi dekke ting du trenger å vite om ikke-grupperte indekser.
hva er en ikke-gruppert indeks
en ikke-gruppert indeks (eller vanlig b-treindeks) er en indeks der rekkefølgen på radene ikke samsvarer med den fysiske rekkefølgen til de faktiske dataene. Det er i stedetbestilt av kolonnene som utgjør indeksen. I en ikke-gruppert indeks, bladsidene i indeksen inneholder ingen faktiske data, men inneholder i stedet pekere til de faktiske dataene. Disse pekerne vil peke på grupperte indeksdatasiden der de faktiske dataene finnes (eller heap-siden hvis ingen grupperte indeks eksisterer i tabellen).
hvorfor opprette ikke-grupperte indekser
hovedfordelen ved å ha en ikke-gruppert indeks på et bord er at den gir fastaccess til data. Indeksen gjør at databasemotoren raskt kan finne datauten å måtte skanne gjennom hele tabellen. Som en tabell blir større itis svært viktig at de riktige indekser legges til tabellen, som uten anyindexes spørring ytelse vil falle dramatisk.
når skal ikke-grupperte indekser opprettes
det er to tilfeller der det er gunstig å ha en ikke-gruppert indeks på et bord. Først når det er mer enn ett sett med kolonner som brukes I WHERE clauseof-spørringer som har tilgang til tabellen. En annen indeks (forutsatt at det allerede er en gruppert indeks på primærnøkkelkolonnen) vil øke hastigheten på utførelsestider og redusere for de andre spørringene. For det andre, hvis spørringene dine ofte krever datafor å bli returnert i en bestemt rekkefølge, kan det å ha en indeks på disse kolonnene redusere MENGDEN CPU og minne som kreves, da ytterligere sortering ikke trenger å bli gjort siden dataene i indeksen allerede er bestilt.
følgende eksempel showshow ingen tabellskanning er nødvendig for å hente dataene, bare en indekssøk av den ikke-klyngede indeksen og et oppslag av den klyngede indeksen for å få dataene. Vær også oppmerksom på detingen sortering er nødvendig da dataene allerede er i riktig rekkefølge.
SELECT * FROM Sales.SalesOrderDetail WHERE ProductID = 750ORDER BY ProductID;
hvordan lage en ikke-gruppert indeks
Opprette en ikke-gruppert indeks Er i utgangspunktet det samme som å opprette gruppert indeks, men i stedet for å spesifisere klyngeklausulen vi spesifiserkonklusjonert. Vi kan også utelate denne klausulen helt som en ikke-gruppert er standard når du oppretter en indeks.
TSQL nedenfor viser et eksempel på hver setning.
-- Adding non-clustered index CREATE NONCLUSTERED INDEX IX_Person_LastNameFirstName ON Person.Person(LastName ASC,FirstName ASC);CREATE INDEX IX_Person_FirstName ON Person.Person (FirstName ASC);
hva er en dekkindeks
Acovering index er en indeks som består av alle (eller flere) av kolonnene som kreves for å tilfredsstille en spørring som nøkkelkolonner i indeksen. Når en dekkindekskan brukes til å utføre en spørring, kreves færre IO-operasjoner siden optimizerno lenger må utføre ekstra oppslag for å hente de faktiske tabelldataene.
Nedenfor Er ET eksempel PÅ TSQL du kan bruke til å lage acovering index På Produkttabellen.
CREATE NONCLUSTERED INDEX IX_Production_ProductNumber_Name ON Production.Product (Name ASC,ProductNumber ASC);
FØLGENDE TSQL-spørring kan nå utføres ved bare å få tilgang til den nye indexenvi har nettopp opprettet siden alle kolonnene i spørringen er en del av indeksen.
SELECT ProductNumber, Name FROM Production.Product WHERE Name = 'Cable Lock';
followingEXPLAIN-planen bekrefter at det ikke kreves ekstra oppslag for denne spørringen.
hva er en indeks med inkluderte kolonner
en indeks opprettet med inkluderte kolonner er en ikke-gruppert indeks som også inkludererikke-nøkkel-kolonner i bladnodene i indeksen, på samme måte som en gruppert indeks. Det er et par fordeler med å bruke inkluderte kolonner. Først gir det degmuligheten til å inkludere kolonnetyper som ikke er tillatt som indeksnøkler i yourindex. Også når alle kolonnene i spørringen er enten en indeksnøkkel orincluded kolonne, spørringen ikke lenger har å gjøre et ekstra oppslag for å få allthe data som trengs for å tilfredsstille spørringen som resulterer i færre diskoperasjoner. Dette ligner på dekkindeksen nevnt tidligere.
Ved å Bruke samme eksempelfra OVER FØLGENDE TSQL vil opprette den samme indeksen unntatt Med ProductNumber columnreferenced som en inkludert kolonne og ikke en indeksnøkkel kolonne.
CREATE NONCLUSTERED INDEX IX_Production_ProductNumber_Name ON Production.Product (Name ASC) INCLUDE (ProductNumber);
Ved å Bruke samme spørring som ovenfor, bør dette også kunne utføres uten å kreve ekstra oppslag.
SELECT ProductNumber, Name FROM Production.Product WHERE Name = 'Cable Lock';
followingEXPLAIN-planen bekrefter at det ikke kreves ekstra oppslag for denne spørringen også.
ikke-grupperte indekser i forhold til gruppert indeks
som beskrevet ovenfor lagrer den grupperte indeksen de faktiske dataene for ikke-keycolumns i bladnodene i indeksen. Bladnodene for hver ikke-gruppert indeks inneholder ingen data og har i stedet pekere til den faktiske datasiden (eller bladnoden) i gruppert indeks. Diagrammet nedenfor illustrerer dettepunkt.
Filtrerte Indekser
Hva er Det?
Afiltrert indeks er en spesiell indekstype der bare en viss del av radene i tabellen er indeksert. Basert på filterkriteriene som brukes nårindeksen er opprettet, er bare de resterende radene indeksert som kan spare plass, forbedre spørringsytelsen og redusere vedlikehold overhead da indeksen er muchsmaller.
hvorfor bruke det ?
Filtrerte indekser er nyttige når du oppretter indekser på tabeller der det er MANGE NULLVERDIER i bestemte kolonner eller visse kolonner har en svært lav kardinalityog du spør ofte en lavfrekvent verdi.
hvordan lage den?
Afiltered index opprettes ganske enkelt ved å legge TIL EN WHERE-setning i en ikke-clusteredindex-opprettelseserklæring. FØLGENDE TSQL er et eksempel på syntaksen tilopprett en filtrert indeks.
CREATE NONCLUSTERED INDEX IX_SalesOrderHeader_OrderDate_INC_ShipDate ON Sales.SalesOrderHeader(OrderDate ASC) WHERE ShipDate IS NULL;
Bekreft Indeksbruk
følgende spørring bør bruke vår nyopprettede indeks, da det er svært få poster I tabellen med ShipDate NULL. Her er TSQL.
SELECT OrderDate FROM Sales.SalesOrderHeader WHERE ShipDate IS NULLORDER BY OrderDate ASC;