CES 2004 - Vitajte na stránkach www.einsty.hostujem.sk
CES 2004 - Vitajte na stránkach www.einsty.hostujem.sk
CES 2004 - Vitajte na stránkach www.einsty.hostujem.sk
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
I N F O W A R Eindex. Potom kontroluje záz<strong>na</strong>m v ståpci root, ktorýje definovaný dátovým typom binárnym a obsahujeúdaj o umiestnení koreòovej stránky klastrovanéhoindexu. Ak ju lokalizuje, zaène porovnávah¾adanú hodnotu, v <strong>na</strong>šom prípade je to èíslo 1587.SQL ju h¾adá <strong>na</strong>jprv <strong>na</strong> koreòovej stránke, ak tamnie je, postupuje o úroveò nišie, a to <strong>na</strong> základeprepojenia indexových stránok. Tentoraz nemusíís pri lokalizácii nového extentu alebo stránky <strong>na</strong>FirstIAM (pozera do mapy), ale ide priamo a <strong>na</strong>h¾adaný údaj. Pri takomto <strong>sk</strong>ene je niší poèet <strong>sk</strong>enovanýchstránok a tým aj operácií I/O <strong>na</strong> di<strong>sk</strong>ovomsubsystéme. Ilustráciou je obrázok è. 5 a takistoaj exekuèný plán, ktorý sa zobrazí v aplikáciiQuery A<strong>na</strong>lyzer po príkaze:USE NorthwindSELECT * FROM dbo.[Order Details]Pomocou príkazu SET STATISTICS IO ON môemezisti poèet <strong>sk</strong>enovaných dátových stránok. Pri absenciiindexu sa ich poèet výrazne zvýši. Klastrovanýindex by sa dal prirov<strong>na</strong> aj k slovníku. Tak akosú v slovníku objekty (slová) zoraïované pod¾aabecedy, aj riadky v tabu¾ke <strong>na</strong> SQL Serveri sú zoraïovanépod¾a po-¾a, <strong>na</strong>d ktorým je indexvytvorený. H¾adaniev slovníku jetriviálne. Ak h¾adámeslovo cluster, ve¾mirýchlo vyberiemestranu, kde saslovo <strong>na</strong>chádza, a<strong>na</strong> tejto strane hovyh¾adáme – „pre<strong>sk</strong>enujeme“ju. Kebyvšak klastrovanýindex chýbal, boloby takmer nemonévyh¾ada všetky vý<strong>sk</strong>ytyslova cluster.K tejto asociácii saešte vrátime prineklastrovanom obr. 6indexe.Vráme sa k a<strong>na</strong>lógii vyh¾adávania konkrétnehomiesta v neznámom meste. Tu je <strong>na</strong>jpriliehavejšieprirov<strong>na</strong>nie k <strong>sk</strong>úsenému turistovi s mapou. Kým prištruktúre HEAP musel blúdiaci neustále <strong>na</strong>zera domapy a blúdi po uliciach, v neklastrovanom indexesa turistovi staèí raz pozrie do mapy a <strong>na</strong> prvýkrátnájde miesto urèenia. Ak teda h¾adáme záz<strong>na</strong>mzamest<strong>na</strong>nca 1587, SQL <strong>na</strong>jprv kontroluje sysindexes,kde zistí hodnotu väèšiu ako 1. Na základe údajav poli root vyh¾adá koreò neklastrovaného indexua zaène preh¾adáva indexové stránky a hodnoty <strong>na</strong>nich porovnáva s èíslom 1587. Po tom, èo príde <strong>na</strong>listovú úroveò indexových stránok, nájde pri hodnote1587 pointer. Ten ho odkazuje <strong>na</strong> konkrétnyextent, konkrétny súbor a definuje aj konkrétnyzáz<strong>na</strong>m. Vyh¾adanie je teda jednoduché aj vtedy, aksamotné dátové stránky nie sú usporiadané (neklastrovanýindex <strong>na</strong> heape). Keby bol v tejto tabu¾kevytvorený aj klastrovaný index (<strong>na</strong>pr. <strong>na</strong>d po¾omPriezvi<strong>sk</strong>o), <strong>na</strong>miesto èíselného pointera by sa tu <strong>na</strong>chádzalúdaj (èie priezvi<strong>sk</strong>o zamest<strong>na</strong>nca è. 1587).Problém by vznikol vtedy, keby výsledok dopytupozostával z viacerých záz<strong>na</strong>mov. H¾adajme zamest<strong>na</strong>ncovod èísla 25 po 1587. Turista by musel pozerado mapy vdy práve raz pre kadé h¾adané miesto.SQL server sa teda musí pre kadý záz<strong>na</strong>m vráti<strong>na</strong> indexové stránky neklastrovaného indexu. Prerozsahy dát teda tento spôsob indexovania nie jeefektívny (obr. 6).INDEXOVANÉ POH¼ADYAby boli indexy úèinné, musia by dobre <strong>na</strong>vrhnuté.Výz<strong>na</strong>mným pomocníkom je sprievodca IndexTuning Wizard. Pomocou tohto sprievodcu dokáe<strong>sk</strong>úsený databázový administrátor definova optimálnuštruktúru indexov <strong>na</strong>d tabu¾kami. Dobre<strong>na</strong>vrhnuté indexy vytvoria predpoklady <strong>na</strong> maximálnyvýkon servera nielen pri èítaní, ale aj pri zápisedát. Niekedy však databázové aplikácie vykonávajúdopytovanie poh¾adov, ktoré sú vytvorené <strong>na</strong>dtabu¾kami. Poh¾ady však nie sú fyzické dáta a ne<strong>na</strong>chádzajúsa <strong>na</strong> dátových ani indexových stránkach.Jediné, èo je uloené <strong>na</strong> databázovom serveri, jedefinícia poh¾adu. SQL teda vdy pri vykonávanídopytu <strong>na</strong>d poh¾adom kontroluje jeho definíciu apotom vykoná dopyt <strong>na</strong>d podliehajúcimi tabu¾kami.Aj v tomto prípade SQL vyuíva indexovú štruktúru.Poh¾ady sú „virtuálne dáta“, t. j. okrem vlastnýchdát obsahujú aj vypoèítané ståpce alebo sú spojeniamiviacerých tabuliek (klauzulou JOIN). Dopyty <strong>na</strong>dnimi sa budú pouívate¾om zda relatívne pomalé.Microsoft SQL Server od verzie 2000, ale len v edíciiENTERPRISE ponúka monos indexova aj poh¾ady.Základný zmysel indexovania poh¾adov je v urýchlenídopytovania cez poh¾ady a <strong>na</strong>vyše dáva SQLServeru monos vyuíva vypoèítané dáta, ktoré sauloia <strong>na</strong> indexové stránky. Ak je <strong>na</strong>príklad pri dopytenevyhnutné vráti pouívate¾ovi vypoèítané ståpcedát, SQL musí pri kadom (!) takomto úkone dátareálne vypoèítava. Keby sme však mali indexovanýpoh¾ad, ktorý takéto dáta obsahuje, SQL si ich jednoducho„stiahne“ z indexových stránok. Dá sa tedapoveda, e za urèitých okolností indexovaniepoh¾adov z<strong>na</strong>ène zvyšuje výkon databázového servera.Všimnime si podmienky, ktoré treba dodra privytváraní indexu <strong>na</strong>d poh¾admi. Je potrebné dodra<strong>na</strong>stavenia spojenia (session settings) pri vytváranípoh¾adu, pri vykonávaní príkazov INSERT,UPDATE a DELETE a pri samotnom pouívaní poh¾aduQuery Optimizer komponentom.Okrem toho musí poh¾ad spåòa <strong>na</strong>sledujúce podmienky: parameter WITH SCHEMABINDING je povinný referencia je povolená len k tabu¾kám tej istejdatabázy klauzula GROUP BY nesmie obsahova HAVING,CUBE alebo ROLLUP klauzula OUTER JOIN je zakázaná klauzula UNION je zakázaná klauzula DISTINCT alebo TOP je zakázaná funkcia ROWSET (<strong>na</strong>pr. OPENROWSET) je zakázaná delené tabu¾ky alebo poddopyty sú zakázané ANSI_NULLS a QUOTED_IDENTIFIER sú pri vytváranív polohe ONNastavenia spojenia Musí by Východi<strong>sk</strong>ováhodnotaANSI_NULLS ON OFFANSI_PADDING ON ONANSI_WARNING ON OFFARITHABORT ON OFFCONCAT_NULL_YEILDS_NULL ON OFFNUMERIC_ROUNDABORT OFF OFFQUOTED_IDENTIFIER ON OFFVýhody pouitia indexovaných poh¾adov simôeme ilustrova <strong>na</strong> dopyte, ktorý bude zí<strong>sk</strong>avainformácie o poète dodávate¾ov v databázeNorthwind.USE NorthwindSELECT s.CompanyName,COUNT_BIG(*) AS COUNTFROM Orders o INNER JOIN Shippers sON o.ShipVia=s.ShipperIDGROUP BY CompanyNamePomocou príkazu SET SHOWPLAN_ALL ON mô-eme ilustrova, ako dopyt pristupuje k dátam.Rozdiel bude zjavný, ak si vytvoríme poh¾ad a ten„oindexujeme“. Index vytvorený <strong>na</strong>d týmto poh¾adomsa bude vyuíva tak pri uvedenom dopyte,ako aj pri dopytovaní poh¾adu.Na záver uveïme <strong>sk</strong>ript potrebný <strong>na</strong> vytvoreniespomí<strong>na</strong>ného poh¾adu:SET QUOTED_IDENTIFIER ONGOCREATE VIEW ShipVwWITH SCHEMABINDINGASSELECT s.CompanyName,COUNT_BIG(*) AS COUNTFROM dbo.Orders o INNER JOIN dbo.Shippers sON o.ShipVia=s.ShipperIDGROUP BY CompanyNameNad týmto poh¾adom potom mono vytvára klastrovanýindex:CREATE UNIQUE CLUSTERED INDEX sch_idx_vwON ShipVw(CompanyName)Peter Gallo130 PC REVUE 2/<strong>2004</strong>