SQL Server indici non-cluster

de: Ben Snaidero
Prezentare generală

în această secțiune vom acoperi lucruri pe care trebuie să știți despre indici non-cluster.

ce este un indice ne-grupat

un indice ne-grupat (sau un indice regulat al arborelui B) este un indice în care ordinea rândurilor nu se potrivește cu ordinea fizică a datelor reale. Este în schimbordonat de coloanele care alcătuiesc indexul. Într-un index non-cluster, paginile de frunze ale indexului nu conțin date reale, ci conțin în schimb indicatoare la datele reale. Acești indicatori ar indica pagina de date a indexului pus în cluster unde există datele reale (sau pagina heap dacă nu există un index pus în cluster în tabel).

de ce a crea indici non-grupate

principalul beneficiu de a avea un index non-grupate pe un tabel este acesta oferă acces rapid la date. Indexul permite motorului bazei de date să localizeze rapid datelefără a fi nevoie să scanați întregul tabel. Ca un tabel devine mai mare itis foarte important ca indicii corecte sunt adăugate la tabel, ca fără anyindexes performanță de interogare va scadea dramatic.

când trebuie creați indici ne-grupați

există două cazuri în care a avea un indice ne-grupat pe un tabel este benefic. În primul rând, atunci când există mai multe seturi de coloane care sunt utilizate în clauza WHERE de interogări care accesează tabelul. Un al doilea index (presupunând că există dejaun index grupat pe coloana cheie primară) va accelera timpii de execuție și va reduce pentru celelalte interogări. În al doilea rând, dacă interogările dvs. necesită frecvent datepentru a fi returnate într-o anumită ordine, având un index pe aceste coloane poate reducecantitatea de CPU și memorie necesară, deoarece nu va trebui făcută o sortare suplimentarădeoarece datele din index sunt deja ordonate.

următorul exemplu arată că nu este necesară scanarea tabelului pentru a prelua datele, ci doar o căutare a indexului non-clusteredindex și o căutare a indexului grupat pentru a obține datele. De asemenea, rețineți cănu este necesară sortarea, deoarece datele sunt deja în ordinea corectă.

SELECT * FROM Sales.SalesOrderDetail WHERE ProductID = 750ORDER BY ProductID;
plan de interogare cu căutare index și căutare cheie

cum se creează un index non-cluster

crearea unui index non-cluster este practic aceeași cu crearea indexului cluster,dar în loc să specificăm cluster-ul, specificămnoncluster. Putem omite, de asemenea, această clauză cu totul ca un non-cluster este implicit atunci când creatingan index.

TSQL de mai jos prezintă un exemplu de fiecare declarație.

-- 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);

ce este un index de acoperire

acovering index este un indice care este alcătuit din toate (sau mai multe) ale coloanelor necesare pentru a satisface o interogare ca coloane cheie ale indexului. Când un index de acoperire poate fi folosit pentru a executa o interogare, sunt necesare mai puține operații IO, deoarece optimizerno nu mai trebuie să efectueze căutări suplimentare pentru a prelua datele tabelului real.

mai jos este un exemplu de TSQL puteți utiliza pentru a crea acovering index pe tabelul de produse.

CREATE NONCLUSTERED INDEX IX_Production_ProductNumber_Name ON Production.Product (Name ASC,ProductNumber ASC);

următoarea interogare TSQL poate fi acum executată doar accesând noul index pe care tocmai l-am creat, deoarece toate coloanele din interogare fac parte din index.

SELECT ProductNumber, Name FROM Production.Product WHERE Name = 'Cable Lock';

planul followingEXPLAIN confirmă că nu este necesară o căutare suplimentară pentru această interogare.

 plan de interogare pentru index seek

ce este un index cu coloane incluse

un index creat cu coloane incluse este un index non-cluster care include, de asemenea, coloane non-cheie în nodurile frunze ale indexului, similar cu un index grupat. Există câteva beneficii pentru utilizarea coloanelor incluse. În primul rând vă oferăcapacitatea de a include tipuri de coloane care nu sunt permise ca chei index în dvs. De asemenea, când toate coloanele din interogarea dvs. sunt fie o cheie index, fie o coloană inclusă, interogarea nu mai trebuie să facă o căutare suplimentară pentru a obține toate datele necesare pentru a satisface interogarea, ceea ce duce la mai puține operații pe disc. Acest lucru este similar cu indicele de acoperire menționat anterior.

folosind același examplefrom de mai sus următoarele TSQL va crea același index cu excepția ProductNumber columnreferenced ca o coloană inclus și nu o coloană cheie index.

CREATE NONCLUSTERED INDEX IX_Production_ProductNumber_Name ON Production.Product (Name ASC) INCLUDE (ProductNumber);

folosind aceeași interogare ca mai sus acest lucru ar trebui să fie, de asemenea, posibilitatea de a executa fără requiringany căutări suplimentare.

SELECT ProductNumber, Name FROM Production.Product WHERE Name = 'Cable Lock';

planul followingEXPLAIN confirmă nu există nici o căutare suplimentară necesară pentru această interogare, de asemenea.

 plan de interogare pentru index seek

indici ne-grupațirelația cu indexul grupat

așa cum este descris mai sus, indexul grupat stochează datele reale ale non-keycolumns în nodurile frunze ale indexului. Nodurile de frunze ale fiecărui non-clusteredindex nu conțin date și au în schimb indicii către pagina de date reală(sau nodul de frunze) al indexului grupat. Diagrama de mai jos ilustrează acest lucrupunct.

index nonclustered versus cluster

indexuri filtrate

ce este?

indicele filtrat este un tip de index special în care sunt indexate doar o anumită porțiune a rândurilor din tabel. Pe baza criteriilor de filtrare care se aplică atunci cândindexul este creat numai rândurile rămase sunt indexate, care pot economisi spațiu, pot îmbunătăți performanța interogării și pot reduce cheltuielile de întreținere, deoarece indicele este mult mai mic.

de ce să-l folosești?

indexurile filtrate sunt utile atunci când creați indexuri pe tabele în care există o mulțime de valori nule în anumite coloane sau anumite coloane au o cardinalitate foarte scăzută și interogați frecvent o valoare de frecvență joasă.

cum să-l creați?

Afiltred index este creat pur și simplu prin adăugarea unei clauze WHERE la orice declarație de creare non-clusteredindex. Următorul TSQL este un exemplu de sintaxăcreați un index filtrat.

CREATE NONCLUSTERED INDEX IX_SalesOrderHeader_OrderDate_INC_ShipDate ON Sales.SalesOrderHeader(OrderDate ASC) WHERE ShipDate IS NULL;

confirmați utilizarea indexului

următoarea interogare ar trebui să utilizeze indexul nou creat, deoarece există foarte puține înregistrări în tabel cu ShipDate NULL. Aici este TSQL.

SELECT OrderDate FROM Sales.SalesOrderHeader WHERE ShipDate IS NULLORDER BY OrderDate ASC;

Lasă un răspuns

Adresa ta de email nu va fi publicată.