Indekset MS sql. Serveri Sql - A ka rëndësi rendi kur krijoni një indeks mbulues në Microsoft SQL? Kolonat e llogaritura konstante

--Një indeks është një strukturë në disk që shoqërohet me një tabelë ose pamje dhe përshpejton rikthimin e rreshtave nga tabela ose pamja. Një indeks përmban çelësa të ndërtuar nga një ose më shumë kolona në një tabelë ose pamje. Këta çelësa ruhen në një strukturë peme të balancuar që mbështet kërkimin e shpejtë të rreshtave sipas vlerave të tyre kryesore në SQL Server.

--Indekset e grupuara renditin dhe ruajnë rreshtat e të dhënave në tabela ose pamje bazuar në vlerat e tyre kryesore. Këto vlera janë kolonat e përfshira në përkufizimin e indeksit. Ekziston vetëm një indeks i grupuar për tabelë, sepse rreshtat e të dhënave mund të renditen vetëm në një renditje të vetme.
--Rreshtat e të dhënave në një tabelë ruhen sipas renditjes vetëm nëse tabela përmban një indeks të grupuar. Nëse një tabelë ka një indeks të grupuar, atëherë tabela quhet e grupuar. Nëse një tabelë nuk ka një indeks të grupuar, rreshtat e të dhënave ruhen në një strukturë të parregulluar të quajtur grumbull.

-- Një indeks jo i grupuar ka saktësisht të njëjtën strukturë si një indeks i grupuar, por me dy dallime të rëndësishme:
--një indeks jo i grupuar nuk e ndryshon rendin fizik të rreshtave në tabelë dhe faqet e fletëve në një indeks jo të grupuar përbëhen nga çelësat e indeksit dhe faqeshënuesit.

--Indekset e grupuara sigurojnë rikthim më të shpejtë të të dhënave sesa indekset jo të grumbulluara. Ata zakonisht rezultojnë të jenë më të shpejtë edhe kur përditësohen, por jo kur shumë përditësime ndodhin në të njëjtin vend në mes të marrëdhënies.

--Për disa arsye, një indeks i grupuar tenton të funksionojë më shpejt se një indeks jo i grupuar. Kur sistemi skanon një indeks të grupuar, nuk ka nevojë të largohet nga struktura e pemës B për të skanuar faqet e të dhënave, sepse faqe të tilla janë tashmë të pranishme në nivelin e gjetheve të pemës.

--Një indeks jo i grupuar kërkon gjithashtu më shumë operacione I/O sesa indeksi korrespondues i grupuar.

-- Indeksi i pa grupuar duhet të lexojë faqet e të dhënave pas skanimit të pemës B ose, nëse ka një indeks të grupuar në një kolonë tjetër të tabelës, indeksi i pa grupuar duhet të lexojë strukturën e pemës B të indeksit të grupuar .

--Kështu që një indeks i grupuar do të jetë dukshëm më i shpejtë se një skanim tabele, edhe nëse selektiviteti i tij është mjaft i dobët (kërkesa kthen shumë rreshta)

KRIJO TABELA tsql.dbo.NI
ID jo NUK NULL,
T char(8) NULL
);

KRIJO TABELE tsql.dbo.NCI
ID jo NUK NULL,
T char(8) NULL
);

--Krijoni një indeks të grupuar

KRIJO INDEKS TË GRUPTUAR IX_1
ON tsql.dbo.NCI(ID);

--Krijoni një indeks jo të grupuar në një tabelë

KRIJONI INDEKSI IX_2 JO TË GJITHSHËM
ON tsql.dbo.NCI(T);

--Shtoni të dhënat e provës
DEKLARONI @i INT = 100000;
DEKLARONI @t CHAR(1) = "T";

NDERSA @i > 0
FILLOJ
fut në vlerat tsql.dbo.NI(@i, @t + CAST(@i AS char(6)));
fut në vlerat tsql.dbo.NCI(@i, @t + CAST(@i AS char(6)));
SET @i -= 1;
FUND

-- Pyetjet në një tabelë me indekse
SELECT ID, T NGA tsql.dbo.NCI
POROSI ME ID, T

SELECT ID, COUNT(*) AS C NGA tsql.dbo.NCI
GRUP SIPAS ID, T

SELECT ID, T NGA tsql.dbo.NCI
KU ID > 4000 DHE ID< 55000 AND T LIKE "T%"

-- Pyetje duke përdorur të dy indekset
PËRDOR tsql;
ZGJIDH CAST(dbo.NCI.ID AS VARCHAR)
NGA dbo.NCI
GRUPI NGA dbo.NCI.ID
UNION TË GJITHA
ZGJIDH dbo.NCI.T
NGA dbo.NCI
GRUPI NGA dbo.NCI.T

--Indekset e informacionit
SELECT index_type_desc, index_depth, index_nivel,
numërimi i faqeve, numri i regjistrimeve
NGA sys.dm_db_index_physical_stats
(DB_ID(N"tsql"), OBJECT_ID(N"dbo.NCI"), NULL, NULL, "DETAJUAR");

--Fshirja e indekseve
NËSE EKZISTON (ZGJEDH emrin NGA sys.indexes
WHERE emri = N"IX_1")
HIQ INDEKSI IX_1 NË tsql.dbo.NCI;

NËSE EKZISTON (ZGJEDH emrin NGA sys.indexes
WHERE emri = N"IX_2")
HIQ INDEKSI IX_2 NË tsql.dbo.NCI;

Në artikullin e mëparshëm, ne prezantuam mënyra për të optimizuar bazat e të dhënave relacionale dhe diskutuam se si funksionojnë indekset e grupuara dhe jo të grupuara në kontekstin e optimizimit të kohës së ekzekutimit të pyetjeve të bazës së të dhënave. Tani është koha për të vënë në praktikë këtë njohuri duke mësuar se si të krijoni indekse optimizimi për një bazë të dhënash MS SQL.

Më lejoni t'ju kujtoj përkufizimin e skemës së tabelës Staffs me të cilën do të punojmë:

Tabela e stafit

Le të themi se duhet të krijojmë një indeks jo të grupuar për tabelën Staffs, i cili do të optimizojë pyetjen e mëposhtme:

ZGJIDH ID-në, Emrin, Vendin e Punës NGA Gjërat KU PAGA > 1000 DHE Fotografia NUK ËSHTË NULL

Çelësi i indeksit do të jetë kolona SLARY dhe Photo, pasi zgjedhja filtrohet nga këto fusha. Dhe kolonat Id, Emri dhe Job do të jenë kolonat e përfshira në indeks.

Sintaksa e përgjithshme e komandës është si më poshtë:

PËRDORIMI SHKO

KRIJONI INDEKS TË JONKLUSTRUAR AKTIV (ASC -- kolonat kryesore të indeksit)

PËRFSHIJ ( -- kolonat e përfshira) GO

Në rastin tonë, kërkesa do të duket si kjo:

(Paga, Foto) PËRFSHIJ (Id, Emri, Puna) SHKO

Ne kemi krijuar një indeks jo të grupuar. Ose më mirë, një indeks mbulues jo i grupuar. Kjo do të thotë që indeksi përmban të gjitha fushat e nevojshme për të ekzekutuar pyetjen dhe SQL Server nuk do të hyjë në tabelën bazë kur ekzekuton pyetjen.

Nëse kodi ynë do të ishte si ky:

KRIJONI INDEKSI I JO GJENDJA IDX_StaffsSearch ON Stuffs

(Paga, Foto) PËRFSHIJ (Id) GO

Në këtë rast, indeksi pushon së qeni një indeks mbulues, pasi nuk përfshin të gjitha kolonat e përdorura në pyetje. Optimizuesi do të vazhdojë të përdorë këtë indeks gjatë ekzekutimit të pyetjes, por efikasiteti i tij do të reduktohet me një renditje të madhësisë pasi do të kërkojë qasje në tabelën bazë.

Indeksi i grupuar krijohet duke përdorur komandën e mëposhtme:

KRIJO INDEKS TË GRUPTUAR IDX_Stsffsid ON Gjëra (Id)

Këtu u krijua një indeks unik i grupuar bazuar në çelësin kryesor të tabelës (kolona Id).

Shembull i vërtetë

Le të zhvillojmë tani një skenar në të cilin mund të vlerësojmë realisht shkallën e fitimit të performancës në rastin e përdorimit të indekseve.

Le të krijojmë një bazë të dhënash të re:

KRIJO BAZA E TË DHËNAVE TestDB;

Dhe një tabelë e vetme e klientëve, e cila do të përbëhet nga katër kolona:

KRIJON TABELA .(

NOT NULL, NULL, NULL, NULL) SHKO

Tani le të mbushim tabelën tonë me të dhëna të rastësishme. Kolona Id do të rritet në një lak, dhe tre kolonat e mbetura të tabelës do të mbushen me numra të rastit duke përdorur një version të veçantë të funksionit të rastësishëm:

DEKLARONI @i int = 0;

Nderkohe une< 500000) BEGIN INSERT INTO Customers(Id, Num1, Num2, Num3) VALUES(

@i, abs(shumë kontrolli(i ri())), abs(shumë kontrolli(i ri())), abs(shumë kontrolli(i ri())) SET @i = @i + 1; FUND

Ky skenar shton gjysmë milioni regjistrime në tabelë, kështu që jini të durueshëm, skenari do të funksionojë për të paktën 3 minuta.

Gjithçka është gati për provë. Ne do të vlerësojmë karakteristikat e performancës së pyetjes. Meqenëse koha e ekzekutimit të pyetjes mund të varet nga makina specifike, ne do të analizojmë një tregues më të pavarur - numrin e leximeve logjike.

Për të aktivizuar modalitetin e mbledhjes së statistikave, duhet të ekzekutoni komandën e mëposhtme:

Tani, pas ekzekutimit të çdo kërkese, në skedën Mesazhe do të kemi akses në statistikat mbi ekzekutimin e kësaj kërkese, siç tregohet më poshtë:

Ne jemi të interesuar vetëm për vlerën e parametrit të leximit logjik.

Pra, nuk ka ende indekse në tabelën tonë. Le të ekzekutojmë tre pyetjet e mëposhtme dhe të regjistrojmë numrin e leximeve logjike për secilën pyetje në tabelën e rezultateve më poshtë:

1) SELECT ID, Num1, Num2 NGA Klientët WHERE ID = 2000

2) SELECT ID, Num1, Num2 FROM Customers WHERE Id >= 0 AND ID< 1000

3) SELECT ID, Num1, Num2 NGA Klientët WHERE Id >= 0 DHE ID< 5000

Këto pyetje do të kthejnë përkatësisht 1 rresht, 1000 rreshta dhe 5000 rreshta. Pa indekse, treguesi i performancës (numri i leximeve logjike) për të gjitha pyetjet është i njëjtë dhe i barabartë me 1621. Le t'i fusim të dhënat në tabelën e rezultateve:

Shohim që për pyetjet e dyta dhe të treta, kur kthehen një numër mjaft i madh rreshtash, indeksi që krijuam nuk e përmirësoi performancën. Sidoqoftë, për një pyetje që kthen një rresht të vetëm, shpejtësia ishte e madhe. Kështu, mund të konkludojmë se ka kuptim të krijohen indekse që nuk mbulojnë kur optimizohen pyetje që japin një rezultat të vetëm.

Tani le të krijojmë një indeks mbulues, duke arritur kështu performancën maksimale.

Së pari, le të fshijmë indeksin e mëparshëm:

PËRDORNI TestDB GO DROP INDEX Customers.TestIndex1

Dhe le të krijojmë një indeks të ri:

KRIJONI INDEKSI I PAGJITHSHËM TestIndeksi 2 NË dbo.Klientët(Id) PËRFSHIJ (Num1, Num2);

Tani le t'i drejtojmë pyetjet tona për herë të tretë dhe t'i shkruajmë rezultatet në një tabelë:

Nuk ka indekse

Indeksi jo mbulues

Indeksi mbulues

Është e lehtë të shihet se rritja e performancës ka qenë e madhe. Kështu, ne e kemi rritur shpejtësinë e ekzekutimit të pyetjeve dhjetëra herë. Kur ekzekutoni një bazë të dhënash që ruan miliona rreshta, ky fitim i performancës do të jetë mjaft i dukshëm.

Në këtë artikull, ne shikuam një shembull të optimizimit të një baze të dhënash duke krijuar indekse. Vlen të përmendet se krijimi i indekseve është një proces thjesht individual për çdo kërkesë. Për të ndërtuar një indeks që do të optimizojë me të vërtetë performancën e pyetjes, duhet të analizoni me kujdes vetë pyetjen dhe planin e ekzekutimit të tij.

Ndërtimi efikas i indeksit është një nga mënyrat më të mira për të përmirësuar performancën e një aplikacioni të bazës së të dhënave. Pa përdorimin e indekseve, SQL Server është si një lexues që përpiqet të gjejë një fjalë në një libër duke parë çdo faqe. Nëse libri ka një indeks lëndor (indeks), lexuesi mund të kërkojë informacionin e nevojshëm shumë më shpejt.

Në mungesë të një indeksi, serveri SQL, kur merr të dhëna nga një tabelë, do të skanojë të gjithë tabelën dhe do të kontrollojë çdo rresht për të parë nëse kriteret e pyetjes janë përmbushur. Një skanim i tillë i plotë mund të jetë katastrofik për performancën e të gjithë sistemit, veçanërisht nëse ka shumë të dhëna në tabela.

Një nga detyrat më të rëndësishme kur punoni me një bazë të dhënash është ndërtimi i një indeksi optimal për të përmirësuar performancën e sistemit. Shumica e bazave të të dhënave kryesore ofrojnë mjete për të parë planin e ekzekutimit të pyetjeve dhe për t'ju ndihmuar të rregulloni dhe optimizoni indekset. Ky artikull thekson disa rregulla të mira praktike që zbatohen kur krijohen ose modifikohen indekset në një bazë të dhënash. Së pari, le të shohim situatat ku indeksimi përmirëson performancën dhe ku indeksimi mund të dëmtojë.

Indekse të dobishme

Pra, indeksimi i tabelës do të jetë i dobishëm kur kërkoni për një rekord specifik në një tabelë duke përdorur deklaratën Where. Pyetje të tilla përfshijnë, për shembull, pyetje që kërkojnë një varg vlerash, pyetje që përputhen me një vlerë të saktë me një vlerë specifike dhe pyetje që bashkojnë dy tabela.

Për shembull, pyetjet e mëposhtme kundër bazës së të dhënave Northwind do të ekzekutohen në mënyrë më efikase kur ndërtohet një indeks në kolonën UnitPrice.

Fshij nga produktet ku UnitPrice=1
Zgjidhni * nga produktet Ku Çmimi Njësi midis 14 dhe 16

Për shkak se artikujt e indeksit ruhen të renditur, indeksimi është gjithashtu i dobishëm kur ndërtoni një pyetje duke përdorur Rendit sipas klauzolës. Pa një indeks, të dhënat ngarkohen dhe renditen ndërsa pyetja po ekzekutohet. Një indeks i bazuar në UnitPrice do t'ju lejojë thjesht të skanoni indeksin dhe të merrni rreshtat me referencë kur përpunoni kërkesën tjetër. Nëse dëshironi të renditni rreshtat në rend zbritës, thjesht mund të skanoni indeksin në rend të kundërt.

Zgjidhni * Nga porositë e produkteve sipas UnitPrice ASC

Grupimi i një rekordi duke përdorur grupin sipas deklaratës gjithashtu shpesh kërkon renditje, kështu që ndërtimi i një indeksi në kolonën UnitPrice do të jetë gjithashtu i dobishëm për pyetjen tjetër që numëron numrin e njësive të një produkti me çdo çmim specifik.

Zgjidhni numrin (*), Çmimi Njësi Nga Grupi i Produkteve sipas Çmimit Njësi

Indekset janë të dobishme për ruajtjen e një vlere unike për një kolonë, pasi DBMS mund të shikojë lehtësisht indeksin për të parë nëse vlera tashmë ekziston. Për këtë arsye, çelësat kryesorë janë gjithmonë të indeksuar.

Disavantazhet e indeksimit

Indekset degradojnë performancën e sistemit gjatë ndryshimeve të regjistrimit. Sa herë që ekzekutohet një pyetje për të ndryshuar të dhënat në një tabelë, indeksi gjithashtu duhet të ndryshojë. Për të zgjedhur numrin optimal të indekseve, duhet të testoni bazën e të dhënave dhe të monitoroni performancën e saj. Sistemet statike, ku bazat e të dhënave përdoren kryesisht për marrjen e të dhënave, siç është raportimi, mund të përmbajnë më shumë indekse për të mbështetur pyetjet vetëm për lexim. Bazat e të dhënave me një numër të madh transaksionesh për të ndryshuar të dhënat do të kenë nevojë për një numër të vogël indeksesh për të siguruar xhiro më të lartë.

Indekset zënë hapësirë ​​shtesë në disk dhe në RAM. Madhësia e saktë do të varet nga numri i regjistrimeve në tabelë, si dhe nga numri dhe madhësia e kolonave në indeks. Në shumicën e rasteve, kjo nuk është një çështje kryesore pasi hapësira në disk tani është e lehtë të sakrifikohet për një performancë më të mirë.

Ndërtimi i një Indeksi Optimal

Indeks i thjeshtë

Një indeks i thjeshtë është një indeks që përdor vlerat e një fushe të vetme në një tabelë. Përdorimi i një indeksi të thjeshtë është i dobishëm për dy arsye. Së pari, drejtimi i një baze të dhënash vë shumë stres në hard diskun tuaj. Çelësat e mëdhenj të indeksit do ta detyrojnë bazën e të dhënave të kryejë më shumë operacione I/O, gjë që kufizon performancën.

Së dyti, për shkak se elementët e indeksit shpesh përfshihen në krahasime, indekset më të vogla janë më të lehta për t'u krahasuar. Për këto dy arsye, një kolonë e vetme numër i plotë është një indeks më i mirë sepse është i vogël dhe i lehtë për t'u krahasuar. Vargjet e karaktereve, nga ana tjetër, kërkojnë krahasime karakter pas karakteri dhe vëmendje ndaj trajtimit të parametrave.

Indeksi selektiv

Indekset më efikase janë ato me përqindje të ulët të vlerave të dyfishta. Për shembull, një drejtori telefonike për një qytet në të cilin pothuajse të gjithë kanë mbiemrin Smith nuk do të jetë aq i dobishëm nëse shënimet në të renditen sipas mbiemrit.

Një indeks me një përqindje të lartë të vlerave unike quhet gjithashtu një indeks selektiv. Natyrisht, një indeks unik ka selektivitetin më të madh, pasi nuk përmban vlera të dyfishta. Shumë DBMS mund të gjurmojnë statistikat për çdo indeks dhe mund të njohin se sa vlera jo të dyfishta përmban çdo indeks. Kjo statistikë përdoret kur gjenerohet një plan ekzekutimi i pyetjeve.

Indekset Mbuluese

Indekset përbëhen nga një kolonë të dhënash mbi të cilën është ndërtuar vetë indeksi dhe një tregues në rreshtin përkatës. Është si indeksi i një libri: ai përmban vetëm fjalë kyçe dhe një lidhje me një faqe ku mund të shkoni për më shumë informacion. Në mënyrë tipike DBMS do të ndjekë treguesit në një rresht nga indeksi për të mbledhur të gjithë informacionin e nevojshëm për pyetjen. Megjithatë, nëse indeksi përmban të gjitha kolonat e nevojshme në pyetje, informacioni mund të merret pa qasje në vetë tabelën.

Le të shqyrtojmë një indeks në kolonën UnitPrice, i cili u përmend më lart. DBMS mund të përdorë vetëm artikujt e indeksit për të ekzekutuar pyetjen tjetër.

Zgjidhni Count(*), UnitPrice Nga Produktet Grupi sipas UnitPrice

Ky lloj pyetësori quhet pyetës mbulues sepse të gjitha kolonat që kërkohen mund të merren nga një indeks i vetëm. Për pyetjet më të rëndësishme, mund të mendoni të krijoni një indeks mbulues për performancën më të mirë të mundshme. Indekse të tillë ka të ngjarë të jenë të përbërë (duke përdorur më shumë se një kolonë), që është e kundërta e parimit të parë: krijoni indekse të thjeshta. Natyrisht, zgjedhja e numrit optimal të kolonave në një indeks mund të vlerësohet vetëm përmes testimit dhe monitorimit të performancës së bazës së të dhënave në situata të ndryshme.

Indeksi i grupimit

Shumë baza të të dhënave kanë një indeks të veçantë në një tabelë, ku të gjitha të dhënat nga një rresht përmbahen në indeks. Në SQL Server, një indeks i tillë quhet indeks i grupuar. Një indeks i grupuar mund të krahasohet me një drejtori telefonike sepse çdo element indeksi përmban të gjithë informacionin që ju nevojitet dhe nuk përmban lidhje për të marrë të dhëna shtesë.

Ekziston një rregull i përgjithshëm - çdo tabelë jo e parëndësishme duhet të ketë një indeks të grupuar. Nëse është e mundur të krijohet vetëm një indeks në një tabelë, bëjeni atë të grupuar. Në SQL Server, kur krijohet një çelës primar, do të krijohet automatikisht një indeks i grupuar (nëse nuk e përmban tashmë), duke përdorur kolonën e çelësit primar si çelës indeksimi. Një indeks i grupuar është indeksi më efikas (nëse përdoret, ai mbulon të gjithë pyetjen) dhe në shumë DBMS një indeks i tillë ndihmon për të menaxhuar në mënyrë efektive hapësirën e kërkuar për ruajtjen e tabelave, pasi përndryshe (pa ndërtuar një indeks të grupuar) rreshtat e tabelës ruhen në një strukturë e parregulluar, e cila quhet një grumbull.

Kini kujdes kur zgjidhni kolonat për një indeks të grupuar. Nëse ndryshoni një rekord dhe ndryshoni vlerën e një kolone në një indeks të grupuar, baza e të dhënave do të detyrohet të rindërtojë artikujt e indeksit (për t'i mbajtur ato në rend të renditur). Mbani mend, artikujt e indeksit për një indeks të grupuar përmbajnë të gjitha vlerat e kolonës, kështu që ndryshimi i vlerës së një kolone është i krahasueshëm me ekzekutimin e një deklarate Delete pasuar nga një deklaratë Insert, e cila padyshim do të shkaktojë probleme të performancës nëse bëhet shpesh. Për këtë arsye, indekset e grupuara shpesh përbëhen nga një çelës kryesor dhe një kolonë e çelësit të huaj. Nëse vlerat kryesore ndryshojnë, ato ndryshojnë shumë rrallë.

konkluzioni

Përcaktimi i indekseve të sakta për t'u përdorur në një bazë të dhënash kërkon analizë dhe testim të kujdesshëm të sistemit. Praktikat e paraqitura në këtë artikull janë rregulla të mira për ndërtimin e indekseve. Pas aplikimit të këtyre metodave, do t'ju duhet të ritestoni aplikacionin tuaj specifik sipas kushteve specifike të harduerit, kujtesës dhe funksionimit.

Një nga mënyrat më të rëndësishme për të arritur produktivitet të lartë SQL Serverështë përdorimi i indekseve. Një indeks përshpejton procesin e pyetjes duke siguruar qasje të shpejtë në rreshtat e të dhënave në një tabelë, ashtu si një indeks në një libër ju ndihmon të gjeni shpejt informacionin që ju nevojitet. Në këtë artikull do të jap një përmbledhje të shkurtër të indekseve në SQL Server dhe shpjegoni se si ato janë të organizuara në bazën e të dhënave dhe si ndihmojnë në përshpejtimin e pyetjeve të bazës së të dhënave.

Indekset krijohen në kolonat e tabelës dhe pamjes. Indekset ofrojnë një mënyrë për të kërkuar shpejt të dhënat bazuar në vlerat në ato kolona. Për shembull, nëse krijoni një indeks në një çelës primar dhe më pas kërkoni për një rresht të dhënash duke përdorur vlerat e çelësit primar, atëherë SQL Server fillimisht do të gjejë vlerën e indeksit dhe më pas do të përdorë indeksin për të gjetur shpejt të gjithë rreshtin e të dhënave. Pa një indeks, do të kryhet një skanim i plotë i të gjitha rreshtave në tabelë, gjë që mund të ketë një ndikim të rëndësishëm në performancë.
Ju mund të krijoni një indeks në shumicën e kolonave në një tabelë ose pamje. Përjashtim janë kryesisht kolonat me lloje të dhënash për ruajtjen e objekteve të mëdha ( LOB), si p.sh imazh, teksti ose varchar (maksimumi). Ju gjithashtu mund të krijoni indekse në kolonat e krijuara për të ruajtur të dhënat në format XML, por këto indekse janë strukturuar pak më ndryshe nga ato standarde dhe shqyrtimi i tyre është përtej qëllimit të këtij neni. Gjithashtu, artikulli nuk diskuton kolonë indekset. Në vend të kësaj, unë fokusohem në ato indekse që përdoren më së shpeshti në bazat e të dhënave SQL Server.
Një indeks përbëhet nga një grup faqesh, nyje indeksi, të cilat janë të organizuara në një strukturë peme - pemë e ekuilibruar. Kjo strukturë është hierarkike në natyrë dhe fillon me një nyje rrënjë në krye të hierarkisë dhe nyjet e gjetheve, gjethet, në fund, siç tregohet në figurë:


Kur pyetni një kolonë të indeksuar, motori i pyetjes fillon në krye të nyjes rrënjësore dhe shkon poshtë përmes nyjeve të ndërmjetme, ku çdo shtresë e ndërmjetme përmban informacion më të detajuar rreth të dhënave. Motori i pyetjeve vazhdon të lëvizë nëpër nyjet e indeksit derisa të arrijë nivelin e poshtëm me gjethet e indeksit. Për shembull, nëse jeni duke kërkuar për vlerën 123 në një kolonë të indeksuar, motori i pyetjeve fillimisht do të përcaktojë faqen në nivelin e parë të ndërmjetëm në nivelin rrënjë. Në këtë rast, faqja e parë tregon një vlerë nga 1 në 100, dhe e dyta nga 101 në 200, kështu që motori i pyetjeve do të hyjë në faqen e dytë të këtij niveli të ndërmjetëm. Më pas do të shihni se duhet të ktheheni në faqen e tretë të nivelit të mesëm tjetër. Nga këtu, nënsistemi i pyetjes do të lexojë vlerën e vetë indeksit në një nivel më të ulët. Gjethet e indeksit mund të përmbajnë ose vetë të dhënat e tabelës ose thjesht një tregues drejt rreshtave me të dhëna në tabelë, në varësi të llojit të indeksit: indeks i grupuar ose indeks jo i grupuar.

Indeksi i grupuar
Një indeks i grupuar ruan rreshtat aktuale të të dhënave në gjethet e indeksit. Duke u rikthyer në shembullin e mëparshëm, kjo do të thotë që rreshti i të dhënave të lidhur me vlerën kryesore 123 do të ruhet në vetë indeksin. Një karakteristikë e rëndësishme e një indeksi të grupuar është se të gjitha vlerat janë renditur në një rend specifik, qoftë në rritje ose në zbritje. Prandaj, një tabelë ose pamje mund të ketë vetëm një indeks të grupuar. Përveç kësaj, duhet të theksohet se të dhënat në një tabelë ruhen në formë të renditur vetëm nëse në këtë tabelë është krijuar një indeks i grupuar.
Një tabelë që nuk ka një indeks të grumbulluar quhet grumbull.
Indeksi jo i grupuar
Ndryshe nga një indeks i grupuar, gjethet e një indeksi jo të grupuar përmbajnë vetëm ato kolona ( Celës) me të cilin përcaktohet ky indeks, dhe gjithashtu përmban një tregues drejt rreshtave me të dhëna reale në tabelë. Kjo do të thotë se sistemi i nënpyetjeve kërkon një operacion shtesë për të gjetur dhe marrë të dhënat e kërkuara. Përmbajtja e treguesit të të dhënave varet nga mënyra se si ruhen të dhënat: tabelë e grupuar ose grumbull. Nëse një tregues tregon një tabelë të grupuar, ai tregon një indeks të grupuar që mund të përdoret për të gjetur të dhënat aktuale. Nëse një tregues i referohet një grumbulli, atëherë ai tregon një identifikues specifik të rreshtit të të dhënave. Indekset e pa grupuara nuk mund të renditen si indekset e grumbulluara, por ju mund të krijoni më shumë se një indeks jo të grupuar në një tabelë ose pamje, deri në 999. Kjo nuk do të thotë se duhet të krijoni sa më shumë indekse të jetë e mundur. Indekset mund të përmirësojnë ose të degradojnë performancën e sistemit. Përveç aftësisë për të krijuar indekse të shumta jo të grumbulluara, mund të përfshini edhe kolona shtesë ( kolona e përfshirë) në indeksin e tij: gjethet e indeksit do të ruajnë jo vetëm vlerën e vetë kolonave të indeksuara, por edhe vlerat e këtyre kolonave shtesë jo të indeksuara. Kjo qasje do t'ju lejojë të anashkaloni disa nga kufizimet e vendosura në indeks. Për shembull, mund të përfshini një kolonë jo të indeksueshme ose të anashkaloni kufirin e gjatësisë së indeksit (900 bajt në shumicën e rasteve).

Llojet e Indekseve

Përveç të qenit një indeks i grupuar ose jo i grupuar, ai mund të konfigurohet më tej si një indeks i përbërë, një indeks unik ose një indeks mbulues.
Indeksi i përbërë
Një indeks i tillë mund të përmbajë më shumë se një kolonë. Mund të përfshini deri në 16 kolona në një indeks, por gjatësia totale e tyre është e kufizuar në 900 bajt. Të dy indekset e grupuar dhe jo të grupuar mund të jenë të përbërë.
Indeks unik
Ky indeks siguron që çdo vlerë në kolonën e indeksuar është unike. Nëse indeksi është i përbërë, atëherë unike vlen për të gjitha kolonat në indeks, por jo për secilën kolonë individuale. Për shembull, nëse krijoni një indeks unik në kolona EMRI Dhe MBIEMRI, atëherë emri i plotë duhet të jetë unik, por dublikatat në emër ose mbiemër janë të mundshme.
Një indeks unik krijohet automatikisht kur përcaktoni një kufizim kolone: ​​çelësi kryesor ose kufizim i vlerës unike:
  • Çelesi primar
    Kur përcaktoni një kufizim të çelësit primar në një ose më shumë kolona atëherë SQL Server krijon automatikisht një indeks unik të grupuar nëse një indeks i grupuar nuk është krijuar më parë (në këtë rast, një indeks unik jo i grupuar krijohet në çelësin primar)
  • Unike e vlerave
    Kur përcaktoni një kufizim në veçantinë e vlerave, atëherë SQL Server automatikisht krijon një indeks unik jo të grupuar. Mund të specifikoni që të krijohet një indeks unik i grupuar nëse ende nuk është krijuar asnjë indeks i grupuar në tabelë
Indeksi mbulues
Një indeks i tillë lejon që një pyetje specifike të marrë menjëherë të gjitha të dhënat e nevojshme nga gjethet e indeksit pa akses shtesë në të dhënat e vetë tabelës.

Projektimi i Indekseve

Sado të dobishme të jenë indekset, ato duhet të dizajnohen me kujdes. Për shkak se indekset mund të zënë hapësirë ​​të konsiderueshme në disk, ju nuk dëshironi të krijoni më shumë indekse sesa duhet. Përveç kësaj, indekset përditësohen automatikisht kur vetë rreshti i të dhënave përditësohet, gjë që mund të çojë në shpenzime shtesë të burimeve dhe degradim të performancës. Gjatë hartimit të indekseve, duhet të merren parasysh disa konsiderata në lidhje me bazën e të dhënave dhe pyetjet ndaj saj.
Baza e të dhënave
Siç u përmend më herët, indekset mund të përmirësojnë performancën e sistemit sepse ato i ofrojnë motorit të pyetjeve një mënyrë të shpejtë për të gjetur të dhëna. Megjithatë, duhet të keni parasysh edhe sa shpesh keni ndërmend të futni, përditësoni ose fshini të dhëna. Kur ndryshoni të dhënat, indekset duhet gjithashtu të ndryshohen për të pasqyruar veprimet përkatëse në të dhëna, të cilat mund të ulin ndjeshëm performancën e sistemit. Merrni parasysh udhëzimet e mëposhtme kur planifikoni strategjinë tuaj të indeksimit:
  • Për tabelat që përditësohen shpesh, përdorni sa më pak indekse të jetë e mundur.
  • Nëse tabela përmban një sasi të madhe të dhënash, por ndryshimet janë të vogla, atëherë përdorni sa më shumë indekse të nevojshme për të përmirësuar performancën e pyetjeve tuaja. Megjithatë, mendoni mirë përpara se të përdorni indekset në tavolina të vogla, sepse... Është e mundur që përdorimi i një kërkimi të indeksit mund të zgjasë më shumë sesa thjesht skanimi i të gjitha rreshtave.
  • Për indekset e grupuara, përpiquni t'i mbani fushat sa më të shkurtra. Qasja më e mirë është përdorimi i një indeksi të grupuar në kolonat që kanë vlera unike dhe nuk lejojnë NULL. Kjo është arsyeja pse një çelës primar përdoret shpesh si një indeks i grupuar.
  • Unike e vlerave në një kolonë ndikon në performancën e indeksit. Në përgjithësi, sa më shumë dublikatë të keni në një kolonë, aq më keq performon indeksi. Nga ana tjetër, sa më shumë vlera unike të ketë, aq më e mirë është performanca e indeksit. Përdorni një indeks unik sa herë që është e mundur.
  • Për një indeks të përbërë, merrni parasysh rendin e kolonave në indeks. Kolonat që përdoren në shprehje KU(Për shembull, WHERE FirstName = "Charlie") duhet të jetë i pari në indeks. Kolonat pasuese duhet të renditen bazuar në veçantinë e vlerave të tyre (kolonat me numrin më të madh të vlerave unike vijnë së pari).
  • Ju gjithashtu mund të specifikoni një indeks në kolonat e llogaritura nëse ato plotësojnë kërkesa të caktuara. Për shembull, shprehjet e përdorura për të marrë vlerën e një kolone duhet të jenë përcaktuese (gjithmonë ktheni të njëjtin rezultat për një grup të caktuar parametrash hyrës).
Pyetjet e bazës së të dhënave
Një konsideratë tjetër gjatë hartimit të indekseve është se cilat pyetje janë duke u drejtuar kundër bazës së të dhënave. Siç u tha më herët, duhet të merrni parasysh sa shpesh ndryshojnë të dhënat. Për më tepër, duhet të përdoren parimet e mëposhtme:
  • Përpiquni të futni ose modifikoni sa më shumë rreshta të jetë e mundur në një pyetje, në vend që ta bëni atë në disa pyetje të vetme.
  • Krijoni një indeks jo të grupuar në kolonat që përdoren shpesh si terma kërkimi në pyetjet tuaja. KU dhe lidhjet në BASHKOHU.
  • Merrni parasysh kolonat e indeksimit të përdorura në pyetjet e kërkimit të rreshtave për përputhjet e sakta të vlerës.

Dhe tani, në fakt:

14 pyetje rreth indekseve në SQL Server që kishit siklet t'i bënit

Pse një tabelë nuk mund të ketë dy indekse të grumbulluara?

Dëshironi një përgjigje të shkurtër? Një indeks i grupuar është një tabelë. Kur krijoni një indeks të grupuar në një tabelë, motori i ruajtjes rendit të gjitha rreshtat në tabelë në rend rritës ose zbritës, sipas përkufizimit të indeksit. Një indeks i grupuar nuk është një entitet i veçantë si indekset e tjera, por një mekanizëm për renditjen e të dhënave në një tabelë dhe lehtësimin e aksesit të shpejtë në rreshtat e të dhënave.
Le të imagjinojmë se keni një tabelë që përmban historinë e transaksioneve të shitjeve. Tabela e shitjeve përfshin informacione si ID-ja e porosisë, pozicioni i produktit në porosi, numri i produktit, sasia e produktit, numri dhe data e porosisë, etj. Ju krijoni një indeks të grumbulluar në kolona ID-ja e porosisë Dhe ID e linjës, të renditura në rend rritës siç tregohet në vijim T-SQL kodi:
KRIJO INDEKS UNIK TË GRUPTUAR ix_oriderid_lineid ON dbo.Sales(OrderID, LineID);
Kur ekzekutoni këtë skript, të gjitha rreshtat në tabelë do të renditen fizikisht fillimisht sipas kolonës OrderID dhe më pas sipas LineID, por vetë të dhënat do të mbeten në një bllok të vetëm logjik, tabelën. Për këtë arsye, nuk mund të krijoni dy indekse të grupuar. Mund të ketë vetëm një tabelë me një të dhënë dhe ajo tabelë mund të renditet vetëm një herë në një renditje të caktuar.

Nëse një tabelë e grumbulluar ofron shumë përfitime, atëherë pse të përdorni një grumbull?

Ke te drejte. Tabelat e grupuara janë të shkëlqyera dhe shumica e pyetjeve tuaja do të performojnë më mirë në tabelat që kanë një indeks të grupuar. Por në disa raste mund të dëshironi t'i lini tavolinat në gjendjen e tyre natyrale, të pacenuar, d.m.th. në formën e një grumbulli, dhe krijoni vetëm indekse jo të grumbulluara për të mbajtur pyetjet tuaja në funksion.
Grumbullimi, siç e mbani mend, ruan të dhënat në mënyrë të rastësishme. Në mënyrë tipike, nënsistemi i ruajtjes shton të dhëna në një tabelë në rendin në të cilin futen, por nënsistemi i ruajtjes gjithashtu pëlqen të lëvizë rreshta për ruajtje më efikase. Si rezultat, nuk keni mundësi të parashikoni se në çfarë rendi do të ruhen të dhënat.
Nëse motori i pyetjeve duhet të gjejë të dhëna pa përfitimin e një indeksi jo të grupuar, ai do të bëjë një skanim të plotë të tabelës për të gjetur rreshtat që i nevojiten. Në tavolina shumë të vogla, kjo zakonisht nuk është problem, por ndërsa grumbulli rritet në madhësi, performanca bie shpejt. Sigurisht, një indeks jo i grupuar mund të ndihmojë duke përdorur një tregues në skedarin, faqen dhe rreshtin ku ruhen të dhënat e kërkuara - kjo është zakonisht një alternativë shumë më e mirë për skanimin e tabelës. Megjithatë, është e vështirë të krahasohen përfitimet e një indeksi të grupuar kur merret parasysh performanca e pyetjeve.
Megjithatë, grumbulli mund të ndihmojë në përmirësimin e performancës në situata të caktuara. Konsideroni një tabelë me shumë futje, por pak përditësime ose fshirje. Për shembull, një tabelë që ruan një regjistër përdoret kryesisht për të futur vlera derisa të arkivohet. Në grumbull, nuk do të shihni faqezim dhe fragmentim të të dhënave siç do të bëni me një indeks të grumbulluar, sepse rreshtat thjesht shtohen në fund të grumbullit. Ndarja e tepërt e faqeve mund të ketë një ndikim të rëndësishëm në performancën, dhe jo në një mënyrë të mirë. Në përgjithësi, grumbulli ju lejon të futni të dhëna relativisht pa dhimbje dhe nuk do t'ju duhet të merreni me shpenzimet e përgjithshme të ruajtjes dhe mirëmbajtjes që do të bënit me një indeks të grumbulluar.
Por mungesa e përditësimit dhe fshirjes së të dhënave nuk duhet të konsiderohet si arsyeja e vetme. Mënyra e mostrimit të të dhënave është gjithashtu një faktor i rëndësishëm. Për shembull, nuk duhet të përdorni një grumbull nëse pyetni shpesh vargjet e të dhënave ose të dhënat që kërkoni shpesh duhet të renditen ose grupohen.
E gjithë kjo do të thotë që ju duhet të konsideroni përdorimin e grumbullit vetëm kur jeni duke punuar me tabela shumë të vogla ose i gjithë ndërveprimi juaj me tabelën është i kufizuar në futjen e të dhënave dhe pyetjet tuaja janë jashtëzakonisht të thjeshta (dhe jeni duke përdorur indekse jo të grupuara gjithsesi). Përndryshe, përmbahuni me një indeks të grupuar të projektuar mirë, si ai i përcaktuar në një fushë të thjeshtë kyçe në rritje, si një kolonë e përdorur gjerësisht me IDENTITET.

Si mund ta ndryshoj faktorin e paracaktuar të mbushjes së indeksit?

Ndryshimi i faktorit të mbushjes së indeksit të paracaktuar është një gjë. Të kuptuarit se si funksionon raporti i paracaktuar është një çështje tjetër. Por së pari, bëni disa hapa prapa. Faktori i mbushjes së indeksit përcakton sasinë e hapësirës në faqe për të ruajtur indeksin në nivelin e poshtëm (niveli i fletës) përpara se të filloni të mbushni një faqe të re. Për shembull, nëse koeficienti është vendosur në 90, atëherë kur indeksi të rritet, ai do të zërë 90% të faqes dhe më pas do të kalojë në faqen tjetër.
Si parazgjedhje, vlera e faktorit të mbushjes së indeksit është in SQL Serverështë 0, që është e njëjtë me 100. Si rezultat, të gjithë indekset e reja e trashëgojnë automatikisht këtë cilësim, përveç nëse specifikoni në mënyrë specifike një vlerë në kodin tuaj që është e ndryshme nga vlera standarde e sistemit ose nuk ndryshoni sjelljen e paracaktuar. Ju mund të përdorni Studio e Menaxhimit të Serverit SQL për të rregulluar vlerën e paracaktuar ose për të ekzekutuar një procedurë të ruajtur në sistem sp_configure. Për shembull, grupi i mëposhtëm T-SQL komanda vendos vlerën e koeficientit në 90 (së pari duhet të kaloni në modalitetin e cilësimeve të avancuara):
EXEC sp_configure "shfaq opsionet e avancuara", 1; SHKO RICONFIGUROJE; GO EXEC sp_configure "fill factor", 90; SHKO RICONFIGUROJE; SHKO
Pas ndryshimit të vlerës së faktorit të mbushjes së indeksit, duhet të rinisni shërbimin SQL Server. Tani mund të kontrolloni vlerën e caktuar duke ekzekutuar sp_configure pa argumentin e dytë të specifikuar:
EXEC sp_configure "fill factor" GO
Kjo komandë duhet të kthejë një vlerë prej 90. Si rezultat, të gjithë indekset e krijuara rishtazi do ta përdorin këtë vlerë. Ju mund ta provoni këtë duke krijuar një indeks dhe duke kërkuar për vlerën e faktorit të mbushjes:
PËRDORIMI AdventureWorks2012; -- databaza juaj SHKO KRIJONI INDEKS TË PAGJITHSHËM ix_people_mbiemri ON Person.Person(LastName); SHKO SELECT fill_factor FROM sys.indexes WHERE object_id = object_id("Person.Person") DHE emri = "ix_people_mbiemri";
Në këtë shembull, ne krijuam një indeks jo të grupuar në një tabelë Personi në bazën e të dhënave AdventureWorks2012. Pas krijimit të indeksit, mund të marrim vlerën e faktorit mbushje nga tabelat e sistemit sys.indexes. Kërkesa duhet të kthejë 90.
Sidoqoftë, le të imagjinojmë që e kemi fshirë indeksin dhe e kemi krijuar përsëri, por tani kemi specifikuar një vlerë specifike të faktorit të mbushjes:
KRIJO INDEKS JO GJENDJE ix_people_mbiemri ON Person.Person(LastName) WITH (fillfactor=80); SHKO SELECT fill_factor FROM sys.indexes WHERE object_id = object_id("Person.Person") DHE emri = "ix_people_mbiemri";
Këtë herë kemi shtuar udhëzime ME dhe opsioni mbushës për operacionin tonë të krijimit të indeksit KRIJONI INDEKS dhe ka specifikuar vlerën 80. Operatori ZGJIDH tani kthen vlerën përkatëse.
Deri tani gjithçka ka qenë mjaft e drejtpërdrejtë. Aty ku vërtet mund të digjeni në të gjithë këtë proces është kur krijoni një indeks që përdor një vlerë të koeficientit të paracaktuar, duke supozuar se e dini atë vlerë. Për shembull, dikush po ngatërron cilësimet e serverit dhe është aq kokëfortë sa e vendos faktorin e mbushjes së indeksit në 20. Ndërkohë, ju vazhdoni të krijoni indekse, duke supozuar se vlera e paracaktuar është 0. Fatkeqësisht, nuk keni asnjë mënyrë për të gjetur mbushjen faktori deri sa të mos krijoni një indeks dhe më pas kontrolloni vlerën siç bëmë në shembujt tanë. Përndryshe, do t'ju duhet të prisni momentin kur performanca e pyetjes bie aq shumë sa të filloni të dyshoni për diçka.
Një çështje tjetër për të cilën duhet të keni parasysh është rindërtimi i indekseve. Ashtu si me krijimin e një indeksi, mund të specifikoni vlerën e faktorit të mbushjes së indeksit kur e rindërtoni atë. Sidoqoftë, ndryshe nga komanda e krijimit të indeksit, rindërtimi nuk përdor cilësimet e paracaktuara të serverit, pavarësisht se si mund të duket. Edhe më shumë, nëse nuk specifikoni në mënyrë specifike vlerën e faktorit të mbushjes së indeksit, atëherë SQL Server do të përdorë vlerën e koeficientit me të cilin ka ekzistuar ky indeks përpara ristrukturimit të tij. Për shembull, operacioni i mëposhtëm ALTER INDEKSI rindërton indeksin që sapo krijuam:
ALTER INDEKSI ix_people_mbiemri ON Personi.Person RIBUILD; SHKO SELECT fill_factor FROM sys.indexes WHERE object_id = object_id("Person.Person") DHE emri = "ix_people_mbiemri";
Kur kontrollojmë vlerën e faktorit të mbushjes, do të marrim një vlerë prej 80, sepse kjo është ajo që kemi specifikuar kur kemi krijuar për herë të fundit indeksin. Vlera e paracaktuar nuk merret parasysh.
Siç mund ta shihni, ndryshimi i vlerës së faktorit të mbushjes së indeksit nuk është aq i vështirë. Është shumë më e vështirë të dihet vlera aktuale dhe të kuptohet kur zbatohet. Nëse gjithmonë specifikoni në mënyrë specifike koeficientin kur krijoni dhe rindërtoni indekset, atëherë gjithmonë e dini rezultatin specifik. Nëse nuk duhet të shqetësoheni për t'u siguruar që dikush tjetër të mos prishë cilësimet e serverit përsëri, duke bërë që të gjithë indekset të rindërtohen me një faktor mbushjeje qesharake të ulët të indeksit.

A është e mundur të krijohet një indeks i grupuar në një kolonë që përmban dublikatë?

Po dhe jo. Po, mund të krijoni një indeks të grupuar në një kolonë kyçe që përmban vlera të kopjuara. Jo, vlera e një kolone kyçe nuk mund të mbetet në një gjendje jo unike. Më lejo të shpjegohem. Nëse krijoni një indeks jo unik të grupuar në një kolonë, motori i ruajtjes shton një unifikues në vlerën e kopjuar për të siguruar unike dhe për këtë arsye të jetë në gjendje të identifikojë çdo rresht në tabelën e grupuar.
Për shembull, mund të vendosni të krijoni një indeks të grupuar në një kolonë që përmban të dhëna të klientit Mbiemri duke mbajtur mbiemrin. Kolona përmban vlerat Franklin, Hancock, Washington dhe Smith. Pastaj futni përsëri vlerat Adams, Hancock, Smith dhe Smith. Por vlera e kolonës kryesore duhet të jetë unike, kështu që motori i ruajtjes do të ndryshojë vlerën e dublikatave në mënyrë që ato të duken diçka si kjo: Adams, Franklin, Hancock, Hancock1234, Washington, Smith, Smith4567 dhe Smith5678.
Në pamje të parë, kjo qasje duket e mirë, por një vlerë e plotë rrit madhësinë e çelësit, gjë që mund të bëhet problem nëse ka një numër të madh dublikatash dhe këto vlera do të bëhen baza e një indeksi jo të grupuar ose një i huaj. referencë kyçe. Për këto arsye, gjithmonë duhet të përpiqeni të krijoni indekse unike të grumbulluara kur është e mundur. Nëse kjo nuk është e mundur, atëherë të paktën përpiquni të përdorni kolona me një përmbajtje shumë të lartë unike.

Si ruhet tabela nëse nuk është krijuar një indeks i grupuar?

SQL Server mbështet dy lloje tabelash: tabela të grupuara që kanë një indeks të grumbulluar dhe tabela grumbulli ose thjesht grumbullime. Ndryshe nga tabelat e grumbulluara, të dhënat në grumbull nuk janë të renditura në asnjë mënyrë. Në thelb, ky është një grumbull (grumbull) të dhënash. Nëse shtoni një rresht në një tabelë të tillë, motori i ruajtjes thjesht do ta shtojë atë në fund të faqes. Kur faqja mbushet me të dhëna, ajo do të shtohet në një faqe të re. Në shumicën e rasteve, do të dëshironi të krijoni një indeks të grupuar në një tabelë për të përfituar nga renditja dhe shpejtësia e pyetjeve (provoni të imagjinoni të kërkoni një numër telefoni në një libër adresash të pazgjedhur). Megjithatë, nëse zgjidhni të mos krijoni një indeks të grupuar, mund të krijoni përsëri një indeks jo të grupuar në grumbull. Në këtë rast, çdo rresht indeksi do të ketë një tregues në një rresht grumbulli. Indeksi përfshin ID-në e skedarit, numrin e faqes dhe numrin e linjës së të dhënave.

Cila është marrëdhënia midis kufizimeve të veçantisë së vlerës dhe një çelësi primar me indekset e tabelave?

Një çelës primar dhe një kufizim unik sigurojnë që vlerat në një kolonë të jenë unike. Mund të krijoni vetëm një çelës primar për një tabelë dhe ai nuk mund të përmbajë vlera I PAVLEFSHËM. Ju mund të krijoni disa kufizime në veçantinë e një vlere për një tabelë, dhe secila prej tyre mund të ketë një rekord të vetëm me të I PAVLEFSHËM.
Kur krijoni një çelës primar, motori i ruajtjes gjithashtu krijon një indeks unik të grupuar nëse një indeks i grupuar nuk është krijuar tashmë. Megjithatë, mund të anashkaloni sjelljen e paracaktuar dhe do të krijohet një indeks jo i grupuar. Nëse ekziston një indeks i grupuar kur krijoni çelësin primar, do të krijohet një indeks unik jo i grupuar.
Kur krijoni një kufizim unik, motori i ruajtjes krijon një indeks unik, jo të grumbulluar. Megjithatë, ju mund të specifikoni krijimin e një indeksi unik të grupuar nëse nuk është krijuar më parë.
Në përgjithësi, një kufizim vlerash unike dhe një indeks unik janë e njëjta gjë.

Pse indekset e grupuara dhe jo të grupuara quhen B-tree në SQL Server?

Indekset bazë në SQL Server, të grumbulluara ose jo, shpërndahen nëpër grupe faqesh të quajtura nyje indeksi. Këto faqe janë të organizuara në një hierarki specifike me një strukturë peme të quajtur pemë e balancuar. Në nivelin e sipërm është nyja rrënjë, në fund janë nyjet e gjetheve, me nyje të ndërmjetme midis niveleve të sipërme dhe të poshtme, siç tregohet në figurë:


Nyja rrënjë siguron pikën kryesore të hyrjes për pyetjet që përpiqen të marrin të dhëna përmes indeksit. Duke u nisur nga kjo nyje, motori i pyetjeve fillon një lundrim poshtë strukturës hierarkike në nyjen përkatëse të fletës që përmban të dhënat.
Për shembull, imagjinoni që është marrë një kërkesë për të zgjedhur rreshtat që përmbajnë një vlerë kyçe prej 82. Nënsistemi i pyetjes fillon të punojë nga nyja rrënjë, e cila i referohet një nyje të përshtatshme ndërmjetëse, në rastin tonë 1-100. Nga nyja e ndërmjetme 1-100 ka një kalim në nyjen 51-100, dhe prej andej në nyjen përfundimtare 76-100. Nëse ky është një indeks i grupuar, atëherë fleta e nyjës përmban të dhënat e rreshtit të lidhur me çelësin të barabartë me 82. Nëse ky është një indeks jo i grupuar, atëherë fleta e indeksit përmban një tregues në tabelën e grupuar ose një rresht specifik në grumbulli.

Si mundet një indeks të përmirësojë performancën e pyetjes nëse duhet të përshkoni të gjitha këto nyje indeksi?

Së pari, indekset jo gjithmonë përmirësojnë performancën. Shumë indekse të krijuara gabimisht e kthejnë sistemin në një moçal dhe degradojnë performancën e pyetjeve. Është më e saktë të thuhet se nëse indekset aplikohen me kujdes, ato mund të ofrojnë përfitime të konsiderueshme të performancës.
Mendoni për një libër të madh kushtuar akordimit të performancës SQL Server(versioni në letër, jo versioni elektronik). Imagjinoni që dëshironi të gjeni informacione rreth konfigurimit të Guvernatorit të Burimeve. Mund të tërhiqni gishtin tuaj faqe për faqe nëpër të gjithë librin ose të hapni tabelën e përmbajtjes dhe të zbuloni numrin e saktë të faqes me informacionin që kërkoni (me kusht që libri të jetë indeksuar saktë dhe përmbajtja të ketë indekset e duhura). Kjo sigurisht që do t'ju kursejë kohë të konsiderueshme, edhe pse fillimisht duhet të përdorni një strukturë krejtësisht të ndryshme (indeksin) për të marrë informacionin që ju nevojitet nga struktura kryesore (libri).
Ashtu si një indeks libri, një indeks në SQL Server ju lejon të ekzekutoni pyetje të sakta mbi të dhënat që ju nevojiten në vend që të skanoni plotësisht të gjitha të dhënat e përfshira në një tabelë. Për tabelat e vogla, një skanim i plotë zakonisht nuk është problem, por tabelat e mëdha marrin shumë faqe të dhënash, gjë që mund të rezultojë në një kohë të konsiderueshme të ekzekutimit të pyetjes, përveç nëse ekziston një indeks që lejon motorin e pyetjeve të marrë menjëherë vendndodhjen e saktë të të dhënave. Imagjinoni të humbisni në një kryqëzim rrugor me shumë nivele përpara një metropoli të madh pa hartë dhe do ta merrni idenë.

Nëse indekset janë kaq të shkëlqyera, pse të mos krijoni vetëm një në çdo kolonë?

Asnjë vepër e mirë nuk duhet të mbetet pa u ndëshkuar. Të paktën kështu është me indekset. Natyrisht, indekset funksionojnë shkëlqyeshëm për sa kohë që drejtoni pyetjet e marrjes së operatorit ZGJIDH, por sapo të fillojnë thirrjet e shpeshta me operatorët INSERT, PËRDITËSOJE Dhe FSHIJE, kështu që peizazhi ndryshon shumë shpejt.
Kur filloni një kërkesë për të dhëna nga operatori ZGJIDH, motori i pyetjeve gjen indeksin, lëviz nëpër strukturën e tij të pemës dhe zbulon të dhënat që kërkon. Çfarë mund të jetë më e thjeshtë? Por gjërat ndryshojnë nëse filloni një deklaratë ndryshimi si p.sh PËRDITËSOJE. Po, për pjesën e parë të deklaratës, motori i pyetjeve mund të përdorë përsëri indeksin për të gjetur rreshtin që modifikohet - ky është një lajm i mirë. Dhe nëse ka një ndryshim të thjeshtë në të dhënat në një rresht që nuk ndikon në ndryshimet në kolonat kryesore, atëherë procesi i ndryshimit do të jetë plotësisht pa dhimbje. Por, çka nëse ndryshimi bën që faqet që përmbajnë të dhënat të ndahen, ose vlera e një kolone kyçe ndryshohet duke bërë që ajo të zhvendoset në një nyje tjetër indeksi - kjo do të rezultojë që indeksi të ketë nevojë për një riorganizim që prek të gjithë indekset dhe operacionet e lidhura , duke rezultuar në një rënie të gjerë të produktivitetit.
Procese të ngjashme ndodhin kur telefononi një operator FSHIJE. Një indeks mund të ndihmojë në gjetjen e të dhënave që fshihen, por vetë fshirja e të dhënave mund të rezultojë në riorganizim të faqes. Në lidhje me operatorin INSERT, armiku kryesor i të gjithë indekseve: fillon të shtosh një sasi të madhe të dhënash, gjë që çon në ndryshime të indekseve dhe riorganizimin e tyre dhe të gjithë vuajnë.
Pra, merrni parasysh llojet e pyetjeve në bazën e të dhënave tuaja kur mendoni se çfarë lloj indeksesh dhe sa të krijoni. Më shumë nuk do të thotë më mirë. Përpara se të shtoni një indeks të ri në një tabelë, merrni parasysh koston jo vetëm të pyetjeve themelore, por edhe sasinë e hapësirës në disk të konsumuar, koston e ruajtjes së funksionalitetit dhe indekseve, të cilat mund të çojnë në një efekt domino në operacione të tjera. Strategjia juaj e projektimit të indeksit është një nga aspektet më të rëndësishme të zbatimit tuaj dhe duhet të përfshijë shumë konsiderata, nga madhësia e indeksit, numri i vlerave unike, deri te lloji i pyetjeve që indeksi do të mbështesë.

A është e nevojshme të krijohet një indeks i grupuar në një kolonë me një çelës primar?

Mund të krijoni një indeks të grupuar në çdo kolonë që plotëson kushtet e kërkuara. Është e vërtetë që një indeks i grupuar dhe një kufizim kryesor i çelësit janë krijuar për njëri-tjetrin dhe janë një përputhje e krijuar në parajsë, kështu që kuptoni faktin që kur krijoni një çelës primar, atëherë një indeks i grupuar do të krijohet automatikisht nëse një i tillë nuk është krijuar. krijuar më parë. Megjithatë, ju mund të vendosni që një indeks i grupuar do të funksiononte më mirë diku tjetër dhe shpesh vendimi juaj do të justifikohet.
Qëllimi kryesor i një indeksi të grupuar është të renditë të gjitha rreshtat në tabelën tuaj bazuar në kolonën kryesore të specifikuar gjatë përcaktimit të indeksit. Kjo siguron kërkim të shpejtë dhe qasje të lehtë në të dhënat e tabelës.
Çelësi kryesor i një tabele mund të jetë një zgjedhje e mirë sepse identifikon në mënyrë unike çdo rresht në tabela pa pasur nevojë të shtoni të dhëna shtesë. Në disa raste, zgjidhja më e mirë do të jetë një çelës primar zëvendësues, i cili nuk është vetëm unik, por edhe me përmasa të vogla dhe vlerat e të cilit rriten në mënyrë sekuenciale, duke i bërë më efikas indekset e pa grupuara të bazuara në këtë vlerë. Optimizuesit të pyetjeve i pëlqen gjithashtu ky kombinim i një indeksi të grupuar dhe një çelësi primar, sepse bashkimi i tabelave është më i shpejtë se bashkimi në një mënyrë tjetër që nuk përdor një çelës primar dhe indeksin e grupuar të lidhur me të. Siç thashë, është një ndeshje e bërë në parajsë.
Në fund, megjithatë, vlen të theksohet se gjatë krijimit të një indeksi të grupuar duhet të merren parasysh disa aspekte: sa indekse jo të grupuara do të bazohen në të, sa shpesh do të ndryshojë vlera e kolonës së indeksit kyç dhe sa e madhe. Kur vlerat në kolonat e një indeksi të grupuar ndryshojnë ose indeksi nuk funksionon siç pritej, atëherë të gjithë indekset e tjera në tabelë mund të preken. Një indeks i grupuar duhet të bazohet në kolonën më të qëndrueshme, vlerat e së cilës rriten në një renditje specifike, por nuk ndryshojnë në mënyrë të rastësishme. Indeksi duhet të mbështesë pyetjet kundrejt të dhënave më të aksesueshme të tabelës, kështu që pyetjet përfitojnë plotësisht nga fakti që të dhënat janë të renditura dhe të aksesueshme në nyjet rrënjësore, në gjethet e indeksit. Nëse çelësi kryesor i përshtatet këtij skenari, atëherë përdorni atë. Nëse jo, atëherë zgjidhni një grup të ndryshëm kolonash.

Po sikur të indeksoni një pamje, a është ende një pamje?

Një pamje është një tabelë virtuale që gjeneron të dhëna nga një ose më shumë tabela. Në thelb, është një pyetje me emër që merr të dhëna nga tabelat themelore kur kërkoni atë pamje. Ju mund të përmirësoni performancën e pyetjes duke krijuar një indeks të grupuar dhe indekse jo të grumbulluara në këtë pamje, të ngjashme me mënyrën se si krijoni indekse në një tabelë, por paralajmërimi kryesor është që fillimisht krijoni një indeks të grumbulluar dhe më pas mund të krijoni një të pa grupuar.
Kur krijohet një pamje e indeksuar (pamje e materializuar), atëherë vetë përkufizimi i pamjes mbetet një entitet i veçantë. Në fund të fundit, ky është vetëm një operator i koduar ZGJIDH, të ruajtura në bazën e të dhënave. Por indeksi është një histori krejtësisht tjetër. Kur krijoni një indeks të grupuar ose jo të grupuar në një ofrues, të dhënat ruhen fizikisht në disk, ashtu si një indeks i rregullt. Përveç kësaj, kur të dhënat ndryshojnë në tabelat themelore, indeksi i pamjes ndryshon automatikisht (kjo do të thotë që ju mund të dëshironi të shmangni indeksimin e pamjeve në tabelat që ndryshojnë shpesh). Në çdo rast, pamja mbetet një pamje - një pamje e tabelave, por një e ekzekutuar për momentin, me indekse që korrespondojnë me të.
Përpara se të krijoni një indeks në një pamje, ai duhet të plotësojë disa kufizime. Për shembull, një pamje mund të referojë vetëm tabelat bazë, por jo pamjet e tjera, dhe ato tabela duhet të jenë në të njëjtën bazë të dhënash. Në fakt ka shumë kufizime të tjera, prandaj sigurohuni që të kontrolloni dokumentacionin për të SQL Server për të gjitha detajet e pista.

Pse të përdorni një indeks mbulues në vend të një indeksi të përbërë?

Së pari, le të sigurohemi se kuptojmë ndryshimin midis të dyve. Një indeks i përbërë është thjesht një indeks i rregullt që përmban më shumë se një kolonë. Mund të përdoren kolona të shumta kryesore për të siguruar që çdo rresht në një tabelë është unik, ose mund të keni disa kolona për të siguruar që çelësi kryesor është unik, ose mund të përpiqeni të optimizoni ekzekutimin e pyetjeve të thirrura shpesh në kolona të shumta. Sidoqoftë, në përgjithësi, sa më shumë kolona kyçe të përmbajë një indeks, aq më pak efikas do të jetë indeksi, që do të thotë se indekset e përbëra duhet të përdoren me maturi.
Siç u tha, një pyetje mund të përfitojë shumë nëse të gjitha të dhënat e kërkuara gjenden menjëherë në gjethet e indeksit, ashtu si vetë indeksi. Ky nuk është problem për një indeks të grupuar sepse të gjitha të dhënat janë tashmë aty (kjo është arsyeja pse është kaq e rëndësishme të mendoni me kujdes kur krijoni një indeks të grupuar). Por një indeks jo i grumbulluar në gjethe përmban vetëm kolona kryesore. Për të hyrë në të gjitha të dhënat e tjera, optimizuesi i pyetjeve kërkon hapa shtesë, të cilët mund të shtojnë shpenzime të mëdha për ekzekutimin e pyetjeve tuaja.
Këtu vjen në shpëtim indeksi i mbulimit. Kur përcaktoni një indeks jo të grupuar, mund të specifikoni kolona shtesë për kolonat tuaja kryesore. Për shembull, le të themi se aplikacioni juaj kërkon shpesh të dhënat e kolonës ID-ja e porosisë Dhe Data e porosisë ne tavoline Shitjet:
ZGJIDH ID-në e porosisë, Data e porosisë NGA shitjet WHERE ID e porosisë = 12345;
Mund të krijoni një indeks të përbërë jo të grupuar në të dyja kolonat, por kolona OrderDate do të shtojë vetëm shpenzimet e përgjithshme të mirëmbajtjes së indeksit pa shërbyer si një kolonë kyçe veçanërisht e dobishme. Zgjidhja më e mirë do të ishte krijimi i një indeksi mbulues në kolonën kryesore ID-ja e porosisë dhe kolona e përfshirë gjithashtu Data e porosisë:
KRIJO INDEKS TË PAGJITHSHËM ix_orderid ON dbo.Sales(OrderID) PËRFSHIJ (Data e Porosisë);
Kjo shmang disavantazhet e indeksimit të kolonave të tepërta duke ruajtur ende përfitimet e ruajtjes së të dhënave në fletë kur ekzekutohen pyetjet. Kolona e përfshirë nuk është pjesë e çelësit, por të dhënat ruhen në nyjen e fletës, në fletën e indeksit. Kjo mund të përmirësojë performancën e pyetjes pa ndonjë shpenzim shtesë. Për më tepër, kolonat e përfshira në indeksin mbulues i nënshtrohen më pak kufizimeve sesa kolonat kryesore të indeksit.

A ka rëndësi numri i kopjimeve në një kolonë kyçe?

Kur krijoni një indeks, duhet të përpiqeni të zvogëloni numrin e kopjimeve në kolonat tuaja kryesore. Ose më saktë: përpiquni ta mbani shkallën e përsëritjes sa më të ulët që të jetë e mundur.
Nëse jeni duke punuar me një indeks të përbërë, atëherë dyfishimi zbatohet për të gjitha kolonat kryesore në tërësi. Një kolonë e vetme mund të përmbajë shumë vlera të kopjuara, por duhet të ketë përsëritje minimale midis të gjitha kolonave të indeksit. Për shembull, ju krijoni një indeks të përbërë jo të grupuar në kolona Emri Dhe Mbiemri, mund të keni shumë vlera John Doe dhe shumë vlera Doe, por dëshironi të keni sa më pak vlera John Doe, ose mundësisht vetëm një vlerë John Doe.
Raporti i veçantisë së vlerave të një kolone kryesore quhet selektiviteti i indeksit. Sa më shumë vlera unike të ketë, aq më i lartë është selektiviteti: një indeks unik ka selektivitetin më të madh të mundshëm. Motori i pyetjeve i pëlqen vërtet kolonat me vlera të larta selektiviteti, veçanërisht nëse ato kolona përfshihen në klauzolat WHERE të pyetjeve tuaja të ekzekutuara më shpesh. Sa më selektiv të jetë indeksi, aq më shpejt motori i pyetjeve mund të zvogëlojë madhësinë e grupit të të dhënave që rezulton. E keqja, natyrisht, është se kolonat me vlera relativisht të pakta unike rrallë do të jenë kandidatë të mirë për indeksim.

A është e mundur të krijohet një indeks jo i grupuar vetëm në një nëngrup specifik të të dhënave të një kolone kryesore?

Si parazgjedhje, një indeks jo i grupuar përmban një rresht për çdo rresht në tabelë. Sigurisht, mund të thuash të njëjtën gjë për një indeks të grupuar, duke supozuar se një indeks i tillë është një tabelë. Por kur bëhet fjalë për një indeks jo të grupuar, marrëdhënia një-për-një është një koncept i rëndësishëm sepse, duke filluar me versionin SQL Server 2008, ju keni mundësinë të krijoni një indeks të filtueshëm që kufizon rreshtat e përfshirë në të. Një indeks i filtruar mund të përmirësojë performancën e pyetjes sepse... është më i vogël në madhësi dhe përmban statistika të filtruara, më të sakta se të gjitha ato tabelare - kjo çon në krijimin e planeve të përmirësuara të ekzekutimit. Një indeks i filtruar kërkon gjithashtu më pak hapësirë ​​ruajtëse dhe kosto më të ulëta mirëmbajtjeje. Indeksi përditësohet vetëm kur ndryshojnë të dhënat që përputhen me filtrin.
Përveç kësaj, një indeks i filtueshëm është i lehtë për t'u krijuar. Në operator KRIJONI INDEKS ju vetëm duhet të tregoni në KU gjendja e filtrit. Për shembull, mund të filtrosh të gjitha rreshtat që përmbajnë NULL nga indeksi, siç tregohet në kod:
KRIJO INDEKS TË PAGJITHSHËM ix_trackingnumber ON Sales.SalesOrderDetail(Numri i përcjelljes së transportuesit) KU Numri i Ndjekjes së Transportuesit NUK ËSHTË NULL;
Në fakt, ne mund të filtrojmë çdo të dhënë që nuk është e rëndësishme në pyetjet kritike. Por kujdes sepse... SQL Server vendos disa kufizime për indekset e filtueshme, si pamundësia për të krijuar një indeks të filtueshëm në një pamje, prandaj lexoni me kujdes dokumentacionin.
Mund të ndodhë gjithashtu që mund të arrini rezultate të ngjashme duke krijuar një pamje të indeksuar. Megjithatë, një indeks i filtruar ka disa përparësi, të tilla si aftësia për të reduktuar kostot e mirëmbajtjes dhe për të përmirësuar cilësinë e planeve tuaja të ekzekutimit. Indekset e filtruara gjithashtu mund të rindërtohen në internet. Provoni këtë me një pamje të indeksuar.

Dhe përsëri pak nga përkthyesi

Qëllimi i shfaqjes së këtij përkthimi në faqet e Habrahabrit ishte t'ju tregojë ose kujtojë për blogun SimpleTalk nga RedGate.
Ai publikon shumë postime argëtuese dhe interesante.
Unë nuk jam i lidhur me ndonjë produkt të kompanisë RedGate, as me shitjen e tyre.

Siç u premtua, libra për ata që duan të dinë më shumë
Unë rekomandoj tre libra shumë të mirë nga vetja (lidhjet të çojnë në ndezin versionet në dyqan Amazon):

Në parim, ju mund të hapni indekse të thjeshta
  • për fillestarët
  • indeks
  • Shto etiketa
    Microsoft SQL Server 2012 T-SQL Fundamentals (Referenca e Zhvilluesit)
    Autori Itzik Ben-Gan
    Data e publikimit: 15 korrik 2012
    Autori, një mjeshtër i zanatit të tij, ofron njohuri bazë për punën me bazat e të dhënave.
    Nëse keni harruar gjithçka ose nuk keni ditur kurrë, patjetër që ia vlen ta lexoni.

    Indekset ROWID janë objekte të bazës së të dhënave që ofrojnë një shfaqje të të gjitha vlerave në një kolonë tabele, si dhe ROWID-et e të gjitha rreshtave në tabelë që përmbajnë vlerat e kolonës.

    ROWIDështë një pseudo-kolona që është një identifikues unik për një rresht në një tabelë dhe në fakt përshkruan vendndodhjen e saktë fizike të atij rreshti të veçantë. Bazuar në këtë informacion Orakulli mund të gjejë më pas të dhënat që lidhen me rreshtin e tabelës. Sa herë që një rresht zhvendoset, eksportohet, importohet ose çdo operacion tjetër që ndryshon vendndodhjen e tij, ROWID linjë sepse zë një pozicion fizik të ndryshëm. Për ruajtjen e të dhënave ROWID Kërkohen 80 bit (10 byte). Identifikuesit ROWID përbëhet nga katër komponentë: numri i objektit (32 bit), numri relativ i skedarit (10 bit), numri i bllokut (22 bit) dhe numri i linjës (16 bit). Këta identifikues shfaqen si sekuenca me 18 karaktere që tregojnë vendndodhjen e të dhënave në bazën e të dhënave, me çdo karakter të përfaqësuar në formatin bazë-64 që përbëhet nga karakteret A-Z, a-z, 0-9, + dhe /. Gjashtë karakteret e para janë numri i objektit të të dhënave, tre të tjerat janë numri relativ i skedarit, gjashtë karakteret e ardhshme janë numri i bllokut dhe tre të fundit janë numri i linjës.

    Shembull:

    ZGJIDH familjen, ROWID NGA studenti;

    FAM ROWID

    ——————————————

    IVANOV AAAA3kAAGAAAAGsAAA

    PETROV AAAA3kAAGAAAAGsAAB

    Në bazën e të dhënave Orakulli indekset përdoren për qëllime të ndryshme: për të siguruar veçantinë e vlerave në bazën e të dhënave, për të përmirësuar performancën e kërkimit të të dhënave në një tabelë, etj. Performanca përmirësohet duke përfshirë një referencë në kolonën ose kolonat e indeksuar në kriteret e kërkimit për të dhënat në tabelë. NË Orakulli indekset mund të krijohen në çdo kolonë tabele përveç kolonave LONG. Indekset bëjnë dallimin midis aplikacioneve të pandjeshme ndaj shpejtësisë dhe aplikacioneve me performancë të lartë, veçanërisht kur punoni me tabela të mëdha. Sidoqoftë, përpara se të vendosni të krijoni një indeks, duhet të peshoni të mirat dhe të këqijat në lidhje me performancën e sistemit. Performanca nuk do të përmirësohet nëse thjesht futni një indeks dhe harroni atë.

    Megjithëse përmirësimi më i madh i performancës vjen nga krijimi i një indeksi në një kolonë ku të gjitha vlerat janë unike, mund të merrni rezultate të ngjashme për kolonat që përmbajnë vlera të kopjuara ose NULL. Nuk është e nevojshme që vlerat e kolonës të jenë unike për të krijuar një indeks. Këtu janë disa rekomandime për t'ju ndihmuar të arrini rritjen e dëshiruar të performancës kur përdorni një indeks standard, dhe ne do të shqyrtojmë gjithashtu çështjet që lidhen me ekuilibrin midis performancës dhe konsumit të hapësirës në disk kur krijoni një indeks.

    Përdorimi i indekseve për të kërkuar informacione në tabela mund të sigurojë përmirësime të konsiderueshme të performancës mbi tabelat skanuese, kolonat e të cilave nuk janë të indeksuara. Megjithatë, zgjedhja e indeksit të duhur nuk është aspak e lehtë. Sigurisht, një kolonë, vlerat e së cilës janë të gjitha unike, preferohet për indeksimin duke përdorur një indeks të pemës B, por një kolonë që nuk i plotëson këto kërkesa është një kandidat i mirë për sa kohë që rreth 10% e rreshtave të saj përmbajnë vlera identike. dhe jo më shumë. Kolonat "Switch" ose "flamur", për shembull ato që ruajnë informacione për gjininë e një personi, nuk janë të përshtatshme për indekset e pemës B. Kolonat që përdoren për të ruajtur një numër të vogël "vlerash të besueshme", si dhe ato që ruajnë vlera të caktuara, gjithashtu nuk janë të përshtatshme, atëherë shenjat, për shembull, "besueshmëri" ose "mosbesueshmëri", "aktivitet" ose "mosaktivitet", "po" ose "jo", etj., etj. Së fundi, indekset me çelësa të kundërt janë përdoret, si rregull, aty ku është instaluar dhe funksionon Orakulli Serveri paralel dhe ju duhet të rrisni nivelin e paralelizmit në bazën e të dhënave në maksimum.