Advertisement
bokunda

BP2

Dec 13th, 2018
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
T-SQL 18.99 KB | None | 0 0
  1. -- Kreiranje klasterovanog indeksa podrazumeva fizičko sortiranje tabele po ključu pretrage, a zatim
  2. -- izgradnju B-stabla nad stranicama tabele.
  3. -- Najcesce PK
  4. -- Primer, telefonski imenik
  5.  
  6. -- Neklasterovani indeksi ne utiču na fizički raspored podataka. Zbog toga ih može biti više nad
  7. -- jednom tabelom.
  8. -- Primer indeks pojmova u knjizi
  9.  
  10. -- http://prntscr.com/luc5lx
  11.  
  12. -- Indeksi se najčešće prave nad kolonama koje se pojavljuju kao argumenti pretrage u WHERE
  13. -- naredbi, ili kao spoljašnji ključ u JOIN naredbi.
  14.  
  15. -- Klasterovani indeksi se obično postavljaju nad
  16. -- nepromenljivim kolonama, a neklasterovani tamo gde se bira mali procenat podataka iz tabele.
  17.  
  18. -- Klasterovani bolje sortira za sve kolone
  19. -- Neklasterovani bolje sortira za kolone svog i klasterovanog kljuca pretrage
  20.  
  21. -- Kreiranje neklasterovanog indeksa
  22. CREATE NONCLUSTERED INDEX ncl_first
  23. ON [dbo].[Person](Firstname)
  24.  
  25. -- Brisanje neklasterovanog indeksa
  26. DROP INDEX ncl_first ON [dbo].[Person]
  27.  
  28. -- Dodavanje PK
  29. ALTER TABLE [dbo].[Person]
  30. ADD CONSTRAINT PK_ID
  31. PRIMARY KEY(BusinessEntityID)
  32.  
  33. -- Uklanjanje PK
  34. ALTER TABLE [dbo].[Person]
  35. DROP CONSTRAINT PK_ID
  36.  
  37. -- Kompozitni indeks
  38. CREATE NONCLUSTERED INDEX ncl_flm
  39. ON person(firstname, lastname, middlename)
  40. -- Zapisi su ovde sortirani prvo po firstname-u, pa lastname-u i na kraju ide middlenam
  41.  
  42. -- kompozitni indeksi su od najvece koristi za ubrzanje upita koji se
  43. -- sortiraju ili grupisu vise kolona
  44.  
  45. DROP INDEX ncl_flm ON Person
  46.  
  47. -- Pomocne procedure
  48. EXEC sp_helpindex person
  49. -- daje listu svih indeksa nad tabelom uz kratak opis i prikaz kljuca
  50.  
  51. EXEC sp_spaceused person
  52. -- prikazuje koliko memorije zauzima prosledjena tabela
  53. -- koliko zauzimaju sami podaci, a koliko indeks
  54.  
  55.  
  56. -----------------------------------------------
  57. SELECT * FROM [dbo].[Person]
  58.  
  59. -- Bez indeksa: 0.17 (operacija TABLE SCAN)
  60. -- Sa indeksom: 0.17 (operacija Clustered Index Scan) --> Isto sto i TABLE SCAN
  61.  
  62. -----------------------------------------------
  63.  
  64. -------------------- WHERE --------------------
  65.  
  66. SELECT *
  67. FROM [dbo].[Person]
  68. WHERE FirstName LIKE 'Diane'
  69.  
  70. -- Bez indeksa: 0.17 (TABLE SCAN)
  71. -- Sa klasterovanim: 0.17 (CLUSTERED INDEX SCAN)
  72. -- Sa neklasterovanim: 0.06 (Key LookUp & Index Seek -> Nasted Loops)
  73.  
  74. -- Posto imamo ncl_first znaci da ce se upit ubrzati posto
  75. -- je uslov pretrage baziran na FirstName-u.
  76.  
  77. -- IndexSeek - prolazi kroz ncl_first i gleda na koje stranice zadovoljavaju WHERE uslov
  78.     -- Uparuje ih sa odgovarajucim PK (Key Lookup ili RID ukoliko nema PK, razlika je sto RID zauzima vise memorije)
  79. -- Nasted Loops -> JOIN, uparuje ova dva i vraca rezultate
  80.  
  81. -----------------------------------------------
  82.  
  83. SELECT *
  84. FROM [dbo].[Person]
  85. WHERE FirstName = 'Diane'
  86.  
  87. -- Bez ncl: 0.17
  88. -- Sa ncl: 0.038
  89.  
  90. -- Razlog zasto je skoro duplo brza procena lezi u pretpostavci
  91. -- da LIKE vraca vise redova od operatora =
  92.  
  93. -----------------------------------------------
  94.  
  95. SELECT FirstName --, BusinessEntityID
  96. FROM [dbo].[Person]
  97. WHERE FirstName = 'Diane'
  98.  
  99. -- Bez ncl: 0.17
  100. -- Sa ncl: 0.003 (Index Seek)
  101.  
  102. -- Razlog, nema potrebe da ulazimo u tabelu
  103. -- Svi podaci su nam vec u indeksu
  104. -- Pored Firstname-a neklasterovani indeks sadrzi i PK/RID
  105.     -- Tako da i njega mozemo vratiti sa istim performansama
  106.  
  107. -----------------------------------------------
  108.  
  109. SELECT COUNT(*)
  110. FROM [dbo].[Person]
  111.  
  112. -- Bez ncl: 0.17
  113. -- Sa ncl: 0.08
  114.  
  115. -- Razlog, nema potrebe da se prolazi kroz tabelu, svi podaci su u indeksu
  116.  
  117. -----------------------------------------------
  118.  
  119. SELECT COUNT(*)
  120. FROM [dbo].[Person]
  121. WHERE FirstName = 'Diane'
  122.  
  123. -- Bez ncl: 0.17
  124. -- Sa ncl: 0.0033029 (Index Seek -> Stream Aggregate -> Compute Scalar)
  125.  
  126. -- Ponovo nema potrebe da ulazimo u tabelu, prebrojavanje vrsimo nad indeksom
  127.     -- Stream Aggregate -> Prolazimo liniju po liniju indeksa i brojimo sa Compute Scalar
  128.  
  129. -----------------------------------------------
  130.  
  131. SELECT COUNT(*)
  132. FROM [dbo].[Person]
  133. WHERE FirstName LIKE 'Diane'
  134.  
  135. -- Bez ncl: 0.17
  136. -- Sa ncl: 0.0033198
  137.  
  138. -- Sve isto kao iznad, malo sporija procena zbog LIKE.
  139. -----------------------------------------------
  140.  
  141. SELECT BusinessEntityID --, FirstName
  142. FROM [dbo].[Person]
  143. WHERE Firstname LIKE 'Diane'
  144.  
  145. -- Bez ncl: 0.17
  146. -- Sa ncl: 0.0033038
  147.  
  148. -- BusinessEntityID nalazi se u neklasterovanom indeksu
  149.  
  150. -----------------------------------------------
  151.  
  152. SELECT lastname
  153. FROM [dbo].[Person]
  154.  
  155. -- Bez ncl: 0.17 (TABLE SCAN)
  156. -- Sa ncl: 0.17 (Clustered Index Scan)
  157.  
  158. -- Razlog, lastname se ne nalazi u ncl, zato se pristupa tabeli
  159.  
  160. -----------------------------------------------
  161.  
  162. SELECT lastname
  163. FROM [dbo].[Person]
  164. WHERE FirstName LIKE 'Diane'
  165.  
  166. -- Bez ncl: 0.17
  167. -- Sa ncl: 0.06
  168.  
  169. -- Razlog, WHERE se odnosi na stavku iz ncl-a, zato prvo mogu da saznam koje sve stranice
  170. -- su mi potrebne iz tabele, a zatim da iste dovucem
  171.  
  172. -----------------------------------------------
  173.  
  174. SELECT *
  175. FROM [dbo].[Person]
  176. WHERE FirstName LIKE 'Richard'
  177.  
  178. -- Bez ncl: 0.17
  179. -- Sa ncl: 0.17
  180.  
  181. -- Razlog, query optimizer je procenio da je jeftinije da procita celu tabelu
  182. -- nego da vise puta pristupa odredjenim stranicama
  183. -- posto se ime Richard pojavljuje dosta cesto u tabelama
  184.  
  185. -----------------------------------------------
  186.  
  187. SELECT BusinessEntityID
  188. FROM [dbo].[Person]
  189.  
  190. -- Bez indeksa: 0.17
  191. -- Sa klasterovanim (PK) indeksom: 0.17
  192. -- Sa neklasterovanim indeksom: 0.07
  193.  
  194. -- Razlog, klasterovani indeks pokazuje na tabelu, i mora kroz celu da prodje,
  195. -- dok neklasterovani ima radi sa kopijom iste a brze je kretati se kroz indeks nego dovlaciti tabelu
  196.  
  197. -----------------------------------------------
  198.  
  199. SELECT BusinessEntityID
  200. FROM [dbo].[Person]
  201. WHERE BusinessEntityID = 1000
  202.  
  203. -- Bez indeksa: 0.17
  204. -- Sa klasterovanim (PK) indeksom: 0.003
  205.  
  206. -- Razlog, kretanjem kroz klasterovani indeks, lako mogu doci do zeljene n-torke gde se nalazi ona koja mi treba
  207.  
  208. -----------------------------------------------
  209.  
  210. SELECT BusinessEntityID
  211. FROM [dbo].[Person]
  212. WHERE BusinessEntityID < 1000
  213.  
  214. -- Bez indeksa: 0.17
  215. -- Sa klasterovanim (PK) indeksom: 0.003
  216.  
  217. -- Ovde kako menjamo vrednost menja se i resenje koje uzima QueryOptimizer,
  218. -- pa nekad ide preko klasterovanog, nekad preko ncl. ( 1000 | 10000 )
  219.  
  220. -----------------------------------------------
  221.  
  222. ------------------ GROUP BY -------------------
  223.  
  224. SELECT FirstName, COUNT(*)
  225. FROM [dbo].[Person]
  226. GROUP BY FirstName
  227.  
  228. -- Bez indeksa: 0.37
  229.     -- TableScan -> Hash Match -> ComputeScalar
  230.     -- za Hash Match pretpostavlja da ce raditi brze od sortiranja
  231.  
  232. -- Sa PK: 0.37
  233.     -- Sve isto, samo umesto tableScan imamo Clustered Index Scan
  234.  
  235. -- Sa NCL: 0.08
  236.     -- Index Scan -> Stream Aggregate -> Compute scalar
  237.  
  238.     -- Nemamo nikakvu hash mapu iz razloga sto nam neklasterovani indeks
  239.     -- poseduje sortiranje po FirstName-u i zato je potrebno samo da prodjemo
  240.     -- kroz isti i prebrojimo, ne pristupamo tabeli.
  241.  
  242. -----------------------------------------------
  243.  
  244. SELECT firstname, lastname, count(*)
  245. FROM [dbo].[Person]
  246. GROUP BY firstname, lastname
  247.  
  248. -- Bez indeksa/sa klasterovanim: 1.51
  249.     -- Table scan/clustered index scan: 0.17
  250.     -- -> Sortiranje tabele 1.32
  251.     -- -> Agregacija (COUNT) i compute
  252.  
  253. -- Sa neklasterovanim: 1.51
  254.     -- U indeksu se nalazi kopija pa imamo sortirano po firstname,
  255.         -- ali moramo pristupiti tabeli zbog lastname
  256.         -- sto znaci da nemam korist od indeksa i radim isto kao bez njih
  257.  
  258. -----------------------------------------------
  259.  
  260. ------------------ ORDER BY -------------------
  261.  
  262. SELECT *
  263. FROM [dbo].[Person]
  264. ORDER BY FirstName
  265.  
  266. -- Bez indeksa i sa klasterovanim: 1.49
  267.         -- Table scan / Clustered index scan
  268.         -- Sort
  269.  
  270. -- Isto vazi i sa neklasterovanim indeksom posto radim sa celom tabelom
  271.     -- vise mi se isplati da ne koristim indeks
  272.  
  273. -----------------------------------------------
  274.  
  275. SELECT firstName
  276. FROM [dbo].[Person]
  277. ORDER BY FirstName
  278.  
  279. -- Bez indeksa i sa klasterovanim: 1.49
  280.     -- Table Scan / Clustered indexscan
  281.     -- Sort
  282.  
  283. -- Sa neklasterovanim
  284.     -- imam indeks koji je sortiran po firstName-u sto mi odgovara
  285.     -- a posto vracam samo firstName, ovde ce mi indeks pomoci
  286.     -- nemam operaciju sort
  287.  
  288. -----------------------------------------------
  289.  
  290. SELECT businessEntityID, firstName
  291. FROM [dbo].[Person]
  292. ORDER BY FirstName
  293.  
  294. -- Bez indeksa / sa klasterovanim: 1.49
  295.     -- Table / Clustered index scan
  296.     -- Sort
  297.  
  298. -- Sa neklasterovanim: 0.07
  299.     -- Isto kao iznad
  300.     -- Radice brze iz razloga sto se i businessEntityID nalazi u indeksu
  301.     -- Ne pristupam tabeli
  302.  
  303. -----------------------------------------------
  304.  
  305. SELECT businessEntityID, firstName, lastname
  306. FROM [dbo].[Person]
  307. ORDER BY FirstName
  308.  
  309. -- U ovoj situaciji mi indeksi ne pomazu: 1.49
  310.     -- Razlog je jer se lastname ne nalazi u neklasterovanom indeksu i onda se prolazi kroz celu tabelu.
  311.  
  312. -----------------------------------------------
  313.  
  314. ALTER TABLE [dbo].[Person]
  315. DROP CONSTRAINT PK_ID
  316.  
  317. SELECT businessEntityID, firstName
  318. FROM [dbo].[Person]
  319. ORDER BY FirstName
  320.  
  321. -- Uklonivsi PK iz tabele, gubi se i klasterovani indeks,
  322.     -- sledi da businessentityID vise nije deo indeksa
  323.     -- i mora se pristupati tabeli za isti, zato se ni ne koristi indeks
  324.     -- i ponasanje je isto kao u primeru iznad
  325.  
  326. -----------------------------------------------
  327.  
  328. SELECT BusinessEntityID
  329. FROM [dbo].[Person]
  330. ORDER BY BusinessEntityID
  331.  
  332. -- Bez klasterovanog: 1.49
  333.     -- Table Scan -> Sort  
  334.  
  335. -- Sa klasterovanim: 0.17
  336.     -- Tabela je vec sortirana, samo citanje
  337.  
  338. -----------------------------------------------
  339.  
  340. SELECT *
  341. FROM [dbo].[Person]
  342. ORDER BY BusinessEntityID
  343.  
  344. -- Bez klasterovanog: 1.49 -> Table scan -> sort
  345. -- Sa klasterovanim: 0.17
  346.     -- Tabela je vec sortirana po PK, tj po BusinessEntityID-u
  347.         -- imamo samo citanje
  348.  
  349. -----------------------------------------------
  350.  
  351. SELECT TOP 5 *
  352. FROM [dbo].[Person]
  353. ORDER BY FirstName
  354.  
  355. -- Sortiranje po firstName-u koji je deo neklasterovanog indeksa
  356.  
  357. -- Bez ncl: 1.49
  358.     -- Mora sortiranje posto posto FirstName nije deo indeksa
  359.     -- TableScan -> Sort
  360.  
  361. -- Sa ncl: 0.02
  362.     -- Nije potreban sort jer vec je sortirano po FirstName-u,
  363.     -- potrebno je samo spojiti sa klasterovanim indeksom kako bi se vratili svi atributi
  364.  
  365. -- NCL je koristan sve dok je broj n-torki koje vracamo znacajno manji od tabele
  366. -----------------------------------------------
  367.  
  368. SELECT TOP 5000 *
  369. FROM [dbo].[Person]
  370. ORDER BY FirstName
  371.  
  372. -- Bez ncl: 1.49
  373. -- Sa ncl: 1.45
  374.  
  375. -- Ovde jos uvek imamo vecu korist upotrebom indeksa,
  376. -- ali za veci select, nece se koristiti indeks
  377.  
  378. -----------------------------------------------
  379.  
  380. SELECT TOP 6000 *
  381. FROM [dbo].[Person]
  382. ORDER BY FirstName
  383.  
  384. -- Bez ncl: 1.49
  385. -- Sa ncl: 1.49
  386.  
  387. -- Presli smo granicu gde je indeks koristan,
  388.     -- zato sada imamo table scan i sort iste.
  389.  
  390. -----------------------------------------------
  391.  
  392. --5000/20000 koristi ncl indeks
  393. --6000/20000 ne koristi ncl indeks
  394.  
  395. -----------------------------------------------
  396.  
  397. ------------- KOMPOZITNI INDEKSI --------------
  398.  
  399. SELECT BusinessEntityID, FirstName
  400. FROM Person
  401.  
  402. -- Bez ncl: 0.17
  403. -- Sa ncl: 0.10
  404.     -- Ne ulazim u tabelu, zato je brze
  405.  
  406. -----------------------------------------------
  407.  
  408. SELECT BusinessEntityID, FirstName
  409. FROM Person
  410. ORDER BY FirstName
  411.  
  412. -- Bez ncl: 1.49
  413.     -- Table scan -> Sort
  414. -- Sa ncl: 0.10
  415.     -- Ne ulazim u tabelu
  416.     -- Ne sortiram
  417.     -- Samo citam
  418.  
  419. -----------------------------------------------
  420.  
  421. SELECT BusinessEntityID, FirstName
  422. FROM [dbo].[Person]
  423. ORDER BY FirstName
  424.  
  425. -- Bez ncl: 1.49
  426.     -- Table scan -> Sort
  427. -- Sa ncl: 0.07
  428.     -- Ne ulazim u tabelu
  429.     -- Ne sortiram
  430.     -- Samo citam
  431. -- Sa kompozitnim ncl: 0.10
  432.     -- Isto kao i sa obicnim ncl, samo sto je ovde indeks veci
  433.     -- zauzima vise memorije pa je sporij
  434.  
  435. -----------------------------------------------
  436.  
  437. SELECT BusinessEntityID, FirstName, LastName
  438. FROM [dbo].[Person]
  439. ORDER BY FirstName
  440.  
  441. -- Bez indeksa: 1.49
  442. -- Sa ncl: 1.49
  443. -- Sa kompozitnim ncl: 0.10
  444.     -- Samo citanje iz indeksa iz razloga sto isti poseduje sve atribute
  445.     -- i sortirano je kako treba
  446.  
  447. -----------------------------------------------
  448.  
  449. SELECT BusinessEntityID, FirstName --, LastName
  450. FROM [dbo].[Person]
  451. ORDER BY LastName
  452.  
  453. -- Bez indeksa: 1.49
  454. -- Sa ncl: 1.49
  455. -- Sa kompozitnim ncl:
  456.     -- Brze iz razloga sto indeks poseduje sve kolone,
  457.     -- sada su sortirane po firstname-u
  458.     -- pa je potrebno sortirati ih po lastname-u
  459.     -- ali i dalje je brze jer je indeks brzi
  460.  
  461. -----------------------------------------------
  462.  
  463. SELECT BusinessEntityID, FirstName --, LastName
  464. FROM [dbo].[Person]
  465. ORDER BY FirstName, LastName
  466.  
  467. -- Bez indeksa: 1.49
  468. -- Sa ncl: 1.49
  469. -- Sa kompozitnim ncl: 0.10
  470.  
  471. -----------------------------------------------
  472.  
  473. SELECT FirstName, Lastname, COUNT(*)
  474. FROM [dbo].[Person]
  475. GROUP BY FirstName, LastName
  476.  
  477. -- Bez indeksa: 1.51
  478. -- Sa ncl: 1.51
  479. -- Sa kompozitnim ncl: 0.12
  480.     -- Nemamo sortiranje, sve je u indeksu i sortirano onako kako nam odgovara
  481.  
  482. -----------------------------------------------
  483.  
  484. SELECT LastName, COUNT(*)
  485. FROM [dbo].[Person]
  486. GROUP BY LastName
  487.  
  488. -- Bez indeksa: 0.38
  489. -- Sa ncl: 0.38
  490. -- Sa kompozitnim: 0.31
  491.     -- Brze jer radi nad indeksom koji ima manje atributa, plus je u memoriji
  492.     -- Razlika je samo u prvoj opraciji, umesto table scan-a imamo IndexScan koji je manji.
  493. -- Svuda radi HashMatch umesto sortiranja jer je brze po proceni Query optimizera.
  494.  
  495. -----------------------------------------------
  496.  
  497. -------------- POMOCNE PROCEDURE --------------
  498.  
  499. EXEC sp_helpindex person
  500. -- daje listu svih indeksa nad tabelom uz kratak opis i prikaz kljuca
  501.  
  502. EXEC sp_spaceused person
  503. -- prikazuje koliko memorije zauzima prosledjena tabela
  504. -- koliko zauzimaju sami podaci, a koliko indeks
  505.  
  506. -- bez ikakvih indeksa:             data 1600KB
  507. -- sa klasterovanim PK:             data 1600KB, index 16KB
  508. -- sa cl PK i ncl idx_first:        data 1600KB, index 544KB
  509. -- sa cl PK i kompozitnim idx_flm:  data 1600KB, index 936KB
  510. -- sa ncl idx_first (bez cl PK):    data 1600KB, index 616KB!
  511.  
  512. -- vise memorije zauzima samo neklasterovani nego kad ide u kombinaciji sa klasterovanim
  513. -- razlog: neklasterovani ima jednu kolonu za PK, odnosno za klasterovani indeks, tip int, zauzima 4KB po vrsti
  514. -- kada nema klasterovanog PK, neklasterovani ima jednu kolonu za RID (Row ID), zauzima 8KB po vrsti
  515.  
  516. -----------------------------------------------
  517.  
  518. ------------------- INCLUDE -------------------
  519.  
  520. -- Dodaju se kolone koje nisu deo kljuca pretrage.
  521.  
  522. -- Kreiranje neklasterovanog indeksa sa include-om
  523. CREATE NONCLUSTERED INDEX idx_first_incl
  524. ON person(firstname) INCLUDE (lastname)
  525.  
  526. -- 1. razlog - SQL server dopusta duzinu kljuca od 16 kolona ili 900 bajtova.
  527. -- Medjutim, sa include mozemo da dodamo proizvoljan broj non-key kolona u indeks.
  528.  
  529. -- 2. razlog - Include-ovane kolone se cuvaju samo u listovima, ne koriste se za pretragu,
  530. -- nisu sortirane, pa ih nema u cvorovima stabla. Samim tim, zauzimaju manje memorije
  531. -- nego dodatna kolona u kljucu pretrage, koja se nalazi i u listovima i u stablu.
  532.  
  533. -- Razlika se vidi obicno kod vecih indeksa.
  534.  
  535. -- ZAKLJUCAK: Kolone koje se koriste za pretragu, grupisanje ili sortiranje
  536. -- treba staviti u kompozitni indeks,
  537. -- a one koje se nalaze samo u SELECT delu treba pridruziti indeksu
  538. -- jer nam za pretragu nisu potrebne, pa ne moraju biti deo kljuca pretrage,
  539. -- a ovako mogu da ustede memoriju.
  540.  
  541. -----------------------------------------------
  542.  
  543. ------------ KLASTEROVANI INDEKSI -------------
  544.  
  545. -- Klasterovani indeksi su obicno primarni kljucevi, ali to ne mora biti slucaj
  546.  
  547. -- Ukoliko sami zelimo da postavimo klasterovani indeks, moramo prvo ukloniti postojeci
  548.  
  549. ALTER TABLE person
  550. ADD CONSTRAINT PK_id
  551. PRIMARY KEY (BusinessEntityID)
  552.  
  553. ALTER TABLE person
  554. DROP CONSTRAINT PK_id
  555.  
  556. -- Kreiranje klasterovanog indeksa
  557. CREATE CLUSTERED INDEX cl_last
  558. ON person(lastname)
  559.  
  560. DROP INDEX cl_last ON person
  561.  
  562. -- Tabela sada zauzima vise memorije
  563.     -- Kada je klasterovani kljuc PK, uz to i auto-increment
  564.     -- racuna se da nece biti INSERT operacija koje ubacuju vrste u sredinu tabele
  565.  
  566.     -- Kada klasterovani kljuc nije PK, a nije ni UNIQUE,
  567.     -- moguce je ubacivati nove vrste u svaki deo tabele,
  568.     -- zato se memorijskoj stranici ostavlja dodatan prazan prostor za buduce nove vrste.
  569.     -- Zato i sama tabela zauzima vise stranica
  570.  
  571. -----------------------------------------------
  572.  
  573. SELECT *
  574. FROM person
  575. WHERE lastname LIKE 'Adams'
  576.  
  577. -- Sa klasterovanim starim: 0.17
  578. -- Sa cl_last: 0.003
  579.     -- Klasterovani indeks predstavlja sortiranu tabelu po tom indeksu
  580.     -- usteda memorije u odnosu na neklasterovani indeks
  581.  
  582. -----------------------------------------------
  583.  
  584. -- Koriscenje INCLUDE naredbe sa klasterovanim indeksom nema smisla
  585. -- Moguce je napraviti klasterovani kompozitni indeks
  586.  
  587. CREATE CLUSTERED INDEX cl_last_first
  588. ON person(lastname, firstname)
  589.  
  590. DROP INDEX cl_last_first ON Person
  591.  
  592. -- data 1664 KB, INDEX 32 KB
  593. -- indeks duplo vise zauzima, jer je duplo veci
  594.  
  595. SELECT *
  596. FROM [dbo].[Person]
  597. ORDER BY lastname, firstname
  598.  
  599. -- Bez indeksa: 1.49
  600.         --> table scan
  601.         --> sort
  602. -- Sa cl_last_first: 0.178
  603.         --> Samo citanje
  604.  
  605. -----------------------------------------------
  606.  
  607. SELECT lastname, firstname, COUNT(*)
  608. FROM [dbo].[Person]
  609. GROUP BY lastname, FirstName
  610.  
  611. -- Bez indeksa: 1.52
  612.         -- table scan
  613.         -- sort
  614.         -- agregacija i racunanje
  615.  
  616. -- Sa indeksom: 0.2
  617.         -- citanje indeksa (table scan)
  618.         -- agregacija i racunanje, nemamo sortiranje
  619.  
  620. -----------------------------------------------
  621.  
  622. -------- PRAVLJENJE NEKLASTEROVANO PK ---------
  623.  
  624. ALTER TABLE person
  625. ADD CONSTRAINT PK_id
  626. PRIMARY KEY NONCLUSTERED (BusinessEntityID)
  627.  
  628. ALTER TABLE person
  629. DROP CONSTRAINT PK_id
  630.  
  631. -----------------------------------------------
  632. -- Indeksi mogu i da uspore izvrsavanje nekih upita (INSERT, UPDATE, DELETE)
  633. ------------------- INSERT --------------------
  634.  
  635. INSERT INTO person(BusinessEntityID, PersonType, FirstName, LastName, ModifiedDate) VALUES (30000, 'EM', 'Pera', 'Peric', '2015-12-3');
  636.  
  637. -- Bez indeksa: 0.01
  638.     -- Table insert: 0.01 - ubacivanje nove vrste u tabelu
  639.     -- Assert - provera da li se narusava neko ogranicenje
  640. -- Klasterovani indeks: 0.01
  641.     -- Clustered Index Insert: 0.01 - ubacivanje nove vrste u tabelu
  642.     -- Assert - provera ogranicenja
  643.  
  644. -- Sa ncl_first: 0.02
  645.     -- Clustered Index Insert: 0.02
  646.         -- duplo vise iz razloga sto osim u tabelu, ubacuje se i u ncl indeks
  647.  
  648. -- Sa ncl_first i kompozitnim: 0.03
  649.     -- Clustered Index Insert: 0.03
  650.         -- isto obrazlozenje, imamo jedan indeks vise za insert
  651.  
  652.  
  653.  
  654.  
  655. -- Klasterovani indeks ne usporava INSERT naredbu
  656. -- Neklasterovani indeksi usporavaju naredbe modifikacije jer se svaka promena mora odraziti i u indeksima
  657.  
  658.  
  659. ------------------- INSERT --------------------
  660.  
  661. UPDATE Person
  662. SET lastname = 'Jovanovic'
  663. WHERE firstname = 'Pera'
  664.  
  665. -- Bez indeksa: 0.1862
  666.     -- Table scan -> Compute -> Update
  667. -- Sa klasterovanim: 0.1862
  668.     -- Isto sve
  669. -- Neklasterovani ncl_last: 0.2
  670.     -- Update traje duplo duze jer treba azurirati vrstu na 2 mesta
  671.  
  672. -- UPDATE je moguce ubrzati jer ima WHERE deo
  673.     CREATE NONCLUSTERED INDEX idx_first
  674.     ON person(firstname)
  675. -- mora da azurira tabelu, ali ne mora i neklasterovani indeks
  676. -- jer se azurira samo kolona LastName, a ona nije deo indeksa idx_first
  677.  
  678.  
  679. -- DELETE ima slicno ponasanje kao UPDATE
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement