trešdiena, 2010. gada 27. oktobris

Indeksi (non-clustered indexes)

Rakstā aprakstīts un ar ilustrācijām parādīts kas ir indeks (non-clustered). Atšķirības starp indeksu, kas veidots uz tabulas bez klusterētā (clustered) indeksa un tabulas ar klusterēto indeksu.

Iepriekšējos rakstos Tabula bez klusterētā (clustered) indeksa un Tabulas ar klusterētu (clustered) indeksu tika aprakstīts kā tiek glabāti tabulu dati MS SQL Server. Pēdējā no minētiem rakstiem varēja iepazīties ar klusterētā indeksa uzbūvi.

Indeksa (non-clustered) uzbūve
Parastais indekss no klusterētā indeksa atšķiras ar beigu virsotnēm. Ja klusterētā indeksa beigu virsotnes satur datu rindas, tad parasta indeksa gadījumā beigu virsotnēs tiek glabātas vērtības ar kuru palīdzību var atrast vajadzīgo datu rindu. 
Izšķir divus gadījumus- vienā gadījumā indeks tiek veidots uz tabulas, kurai nav klusterētais indeks, bet otrā- uz tabulas kurai ir klusterētais indekss.

Indekss uz tabulas bez klusterētā indeksa:

Indekss uz tabulas ar klusterēto indeksu:

Indekss tiek veidots uz konkrētas(ām) kolonnas(ām). Ja tabulai nav klusterētā indeksa, tad beigu virsotnēs tiek glabāta rindas atrašanās vieta- RID (Row ID- aprakstīts rakstā Tabula bez klusterētā (clustered) indeksa). Savukārt, ja tabulai ir klusterētais indekss, beigu virsotnē tiek glabāta klusterētā indeksa atslēga- apzīmēts ar CAtsl (tās/to kolonnas(u) vērtība, uz ko ir izveidots klusterētais indekss- Tabulas ar klusterētu (clustered) indeksu).

Datu meklēšana
Indeksu būtība ir paātrināt datu atrašanu. Jo vairāk indeksu, jo lielāka izvēlēties labāko variantu kā atrast datus. Tiesa gan- jo vairāk indeksu, jo vairāk laika aizņem datu mainīšana un jo vairāk tiek aizņemta vieta.

Tabulā ar klusterēto indeksu tas notiek šādi:
Kā redzams- tiek pēc atslēgas (indeksa kolonas) meklēta atbilstošā lapa, līdz nonāk līdz beigu virsotnei. Beigu virsotnē ir klusterētā indeksa atslēga, tā tiek izmantota lai pārmeklētu klusterēto indeksu un tādējādi atrastu vajadzīgo datu rindu (Piemērs: Indeksi, vaicājumu analīze- rakstā 3. piemērs).
Savukārt ja tabulai nav klusterētā indeksa, tad indeksa beigu virsotnē tiek glabāts RID, kas norāda jau uz konkrētu datu lapu un rindu datu lapā. 
No šī skatu punkta varētu likties, ka izdevīgāk ir veidot tabulu bez klusterētā indeksa, tomēr visbiežāk tomēr tā nav (var palasīt arī šo rakstu- salīdzinājums un beigās secinājumi). 

Iekļautās kolonnas (included columns)
Sākot ar SQL Server 2005 indeksiem ir iespējams pievienot iekļautās kolonnas. Ar to palīdzību var panākt, ka nav jāgriežas pie datu lapas, kurā fiziski tiek glabāti dati, bet pietiek tikai atrast indeksā atbilstošo beigu virsotni. Iekļautās kolonnas dati tiek glabāti indeksa beigu virsotnē, kopā ar tabulas klusterētā indeksa atslēgu, vai, ja tāda tabulai nav, RID. 
Priekšrocības:
* Iekļautās kolonnas ļauj saglabāt indeksu atslēgu īsāku, līdz ar to mazāk līmeņus (koka dziļums), kas nodrošina mazāk lasīšanas operāciju meklēšanas laikā. 
* Ar iekļautajām kolonām var izveidot labus pārklājošos indeksus (lasīt tālāk). 
* Indeksā var iekļaut kolonnas, kurām datu tips nevar tikt iekļauts indeksējamo kolonnu sarakstā (piemēram, varchar(max)).
Trūkumi:
* Indekss var kļūt liels izmērā- aizņem vietu (kolonnu vērtības tiek kopētas)
* Datu mainīšanas vaicājumiem jāmaina arī vērtības indeksos

Pārklājošie indeksi (covering indexes)
Ja indeksā ir atrodamas visas kolonnas, kas tiek izmantotas vaicājumā, tad tāds indekss tiek saukts par pārklājošo indeksu. Šādi indeksi ir īpaši efektīvi veicot datu meklēšanu. Bieži vien tādos jābūt daudz kolonnu un tādēļ tie biežāk jāmaina pie tabulas izmaiņām un tie arī aizņem salīdzinoši daudz vietas.

Piezīmes par indeksiem (non-clustered)
* Ir vēl citi indeksu veidi- XML indeksi, Teksta meklēšanas indeksi (full-text indexes) un citi, kas šeit netiek aprakstīti (indeksu tipi).
* Veidojot indeksu, būtu jāievēro secība, kādā norāda kolonnas. Pirmajai vajadzētu būt kolonnai, kurā visbiežāk ir dažādas vērtības. Tādā veidā tiek panākts, ka mazāk indeksu lapas jāpārmeklē, lai atrastu vajadzīgo lapu.
* Parastie (non-clustered) indeksi ir efektīvi meklējot datus pēc konkrētas vērtības. Secīgās meklēšanas gadījumā no indeksa jāvēršas pie daudzām dažādām datu lapām tabulā, tādēļ, ka lai arī indeksa rindas ir sakārtotas, datu rindu sakārtojums tam neatbilst. Tāpēc bieži šāds indekss tādos gadījumos netiek izmantots (ja vien indekss nav pārklājošs).
* Jo mazāks indekss, jo labāk- izvēloties kolonnas kuras iekļaut indeksā būtu jāņem vērā arī šo kolonnu aizņemtais atmiņas apjoms.
* Ja tabulai ir klusterētais indeks, tad parastā indeksā (non-clustered) visbiežāk ir neefektīvi norādīt klusterētā indeksa kolonnu(as)- tas ir tādēļ, ka indeksa beigu virsotnē jau ir saglabāta klusterētā indeksa vērtība (Piemērs: Indeksi, vaicājumu analīze - 4. punktā dota ilustrācija).

Papildus literatūra
* Primārais avots, kas izmantots ir grāmata, rakstā aprakstītas dažas būtiskas papildus iespējas, kas SQL 2000 vēl nebija realizētas, piemēram, iekļautās kolonnas. Pamata lietas gan joprojām tās pašas.
MSDN par indeksiem daudz noderīgu adrešu šeit
* Par iekļautajām kolonnām var lasīt šeit.

Nav komentāru:

Komentāra publicēšana