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