-- naredba za kreiranje neklasterovanog indeksa -- nad kolonom firstname create nonclustered index idx_first on person(firstname) -- naredba za brisanje indeksa drop index idx_first on person -- ili drop index person.idx_first -- Kreiranje primarnog kljuca nad tabelom -- formira i klasterovani indeks nad kljucem. -- naredba za kreiranje primarnog kljuca -- nad kolonom BusinessEntityID alter table person add constraint PK_ID primary key(BusinessEntityID) -- naredba za uklanjanje primarnog kljuca alter table person drop constraint PK_BusinessEntityID --Display Estimated Execution Plan ikonica u meniju select * from person -- bez klasterovanog indeksa -- vreme izvrsavanja 0.1726 -- execution plan - table scan 100% (ucitavanje cele tabele) -- broj vrsta - oko 20000 -- sa klasterovanim indeksom PK_ID -- sve isto -- execution plan - clustered index scan (drugaciji naziv, -- ali ista operacija kao tabel scan) -----------WHERE----------------------------- select * from person where firstname like 'Diane' -- bez neklasterovanog 0.1726 -- citanje svih vrsta iz tabele -- sa neklasterovanim idx_first 0.063 -- Execution plan: -- index seek 5% (pretraga kroz stablo indeksa) -- key lookup 95% (ucitavanje memorijskih stranica -- sa potebnim podacima iz tabele) -- procenjeno da upit vraca oko 20 vrsta select * from person where firstname = 'Diane' -- bez neklasterovanog 0.1726 -- sa neklasterovanim 0.038 -- procenjeno da upit vraca oko 12 vrsta -- razlicita procena u odnosu na gornji upit uzrokuje razlicito vreme izvrsavanja -- Execution plan nije uvek precizan! select firstname from person where firstname like 'Diane' -- bez neklasterovanog 0.1726 -- sa neklasterovanim 0.0033 (52 puta brze) -- index seek 100% -- uopste se ne pristupa tabeli, sve se cita iz indeksa select count(*) from person -- bez neklasterovanog 0.176 -- stream aggregate 2% - javlja se kod agregatnih funkcija, -- u ovom slucaju prolazi kroz tabelu i broji vrste -- sa neklasterovanim 0.0839 -- index scan 86%, stream aggregate 14% -- ponovo uopste ne pristupa tabeli, broj vrsta moze da se odredi i u indeksu select count(*) from person where firstname like 'Diane' -- bez neklasterovanog 0.176 -- sa neklasterovanim 0.0033 -- index seek 100%, stream aggregate 0% -- pretraga kroz stablo indeksa, zatim brojanje dobijenih vrsta select BusinessEntityID from person where firstname like 'Diane' -- bez neklasterovanog 0.1726 -- sa neklasterovanim 0.0033 (52 puta brze), -- index seek 100%, uopste ne pristupa tabeli -- primarni kljuc je deo neklasterovanog indeksa select BusinessEntityID,firstname from person where firstname like 'Diane' -- isto kao prethodni upit -- broj kolona u select-u ne pravi razliku -- bitno je da su svi podaci u indeksu select lastname from person where firstname like 'Diane' -- sa neklasterovanim 0.063 -- isto kao select * -- cim se selectuje kolona van indeksa, mora da se -- pristupi tabeli, sto usporava upit -- broj kolona van indeksa ne pravi razliku select * from person where firstname like 'Richard' -- bez neklasterovanog 0.1726 -- sa neklasterovanim 0.1726 -- razlog - procenjeno da upit vraca oko 100 vrsta od ukupno 20000 -- to bi bio preveliki broj pristupa tabeli -- neke memorijske stranice bi se ucitavale po vise puta -- efikasnije je proci kroz celu tabelu i ne iskoristiti indeks select BusinessEntityID from Person where BusinessEntityID=1000 -- bez indeksa 0.1726, table scan -- sa klasterovanim PK 0.00328 -- clustered index seek 100% (samo pretraga kroz stablo klasterovanog indeksa) -- upit vraca 1 vrstu select BusinessEntityID from Person where BusinessEntityID<100 -- bez indeksa 0.1726 -- sa klasterovanim PK 0.0033 -- broj vrsta - 100 select BusinessEntityID from Person where BusinessEntityID<1000 -- sa klasterovanim PK 0.0084 -- clustered index seek -- procenjeno 645 vrsta, otud vece vreme izvrsavanja select BusinessEntityID from Person where BusinessEntityID<10000 -- sa klasterovanim PK 0.081 -- clustered index seek -- procenjeno oko 9000 vrsta -----------GROUP BY----------------------------- select firstname, count(*) from person group by firstname -- samo sa klasterovanim PK 0.37 -- clustered index scan 46% 0.1726, procita celu tabelu -- hash match (aggregate) 54% 0.2, izvrsava agregatnu funkciju (u ovom slucaju COUNT) pravljenjem -- hash tabele, bira ovu metodu kao brzi nacin od sortiranja -- sa neklasterovanim 0.084 -- index scan 85%, stream aggregate 15% -- ne pristupa tabeli, svi potrebni podaci su u indeksu, -- imena u indeksu su sortirana, pa je samo potrebno proci jednom kroz tabelu -- i prebrojati broj ponavljanja za svako ime select firstname, lastname, count(*) from person group by firstname, lastname -- samo sa klasterovanim PK 1.515 -- clustered index scan 11%, procita celu tabelu -- sort 87%, sortira je po imenu i prezimenu, ovoga puta bi hash tabela bila sporija zbog dve kolone -- stream aggregate 1%, samo prodje kroz sortiranu tabelu i prebroji ponavljanja -- sa neklasterovanim idx_first isto, 1.515 -- kolona lastname se nalazi van neklasterovanog indeksa, ne isplati se koristiti ga