Databáze Optimalizace, základní knstrukty T-SQL David Hksza http://siret.cz/hksza
Osnva Principy indexvání Optimalizace dtazů v MSSQL Základní knstrukty T-SQL prměnné pdmíněný tk prgramu cykly prcedury Cvičení
Index Struktura umžňující rychlejší vyhledávání na daném slupci/slupcích tabulky Urychlení dsažen pmcnu datvu strukturu, umžňující neprhlížet všechny záznamy v tabulce (sekvenční průchd) Na index lze nahlížet jak na rejstřík v knize, neb na telefnní seznam nevýhdy větší časvé nárky na vkládání dat (nutnst aktualizvat index) větší paměťvá nárčnst
B-strm Strm je speciální typ rientvanéh grafu, ve kterém neexistují cykly Orientvaný graf je datvá struktura bsahující knečnu mnžinu tzv. hran, kde hrany jsu uspřádané páry tzv. uzlů (vlná definice) Princip vyhledávacích strmvých struktur je takvý, že pdstrmy uzlu dělí data d vzájemně disjunktních částí, čehž lze využít při vyhledávání pdle danéh klíče např. u binárníh strmu jsu všechny hdnty v levém pdstrmě menší než v pravém Varianty B-strmu jsu nejčastěji využívané indexvé struktury v sučasných relačních DB redundantní neredundantní
Neredundantní B-strm 1. Křen má alespň 2 ptmky, pkud není listem 2. Každý uzel krmě křene má nejméně m/2 a nejvíce m ptmků 3. Všechny větve jsu stejně dluhé 4. Každý uzel má nejméně m/2 1 a nejvíce m datvých plžek 5. Data v uzlu jsu rganizvána následvně: p, k 1, p 1, d 1,, k n, p n, d n p ukazatele na ptmky k vzestupně (sestupně) uspřádané klíče d ascivaná data k i, p i, d i datvé plžky 6. Je-li U(p i ) pdstrm uzlu p i, pak platí: k U(p i 1 ): k < k i k U(p i ): k > k i
B-strm - Příklad Klíče: 25, 48, 27, 91, 35, 78, 12, 56, 38, 19 48 19 27 78 12 25 35 38 56 91
Redundantní B-strm 5. Data jsu umístěna puze v listech, neb jsu z listů dkazvána 6. Je-li U(p i ) pdstrm uzlu p i, pak platí: k U(p i 1 ): k k i k U(p i ): k > k i Pdmínka 2 zajišťuje, že každá cesta z křene d listu má délku lgm N infrmace existenci neb 2 neexistenci záznamu lze získat v lgaritmickém čase
Prhledávání B-strmu Cílem dtazu je k dtazvacímu klíči nalézt příslušná data, případně zjistit, že se takvý klíč ve strmě nevyskytuje. 1. Vstupíme d křene strmu. 2. Pkud se jedná neredundantní B-strm a dtaz je rven některému z klíčů, pak vrátíme příslušná data a prces uknčíme. V pačném případě vybereme interval d kteréh dtaz spadá a přesuneme se d křene pdstrmu pdle bdu 6 definice B- strmu. 3. Iterujeme pdle bdu 2. Pkud se žádný z klíčů v listvé úrvni neshduje s dtazem uknčíme prhledávání s infrmací, že příslušná data nejsu k dispzici. V pačném případě vrátíme pžadvaná data a uknčíme prces vyhledávání.
B-strm Insert (1) 27 Insert 91 27 25 48 25 48 91 Insert 35 27 48 35 spadne d uzlu (48,91) (35, 48, 91) prstřední klíč (48) se přesune d rdičvskéh uzlu 25 35 91 L L
B-strm Insert (2) 27 48 Insert 78,12 12 25 35 78 91 Insert 56 27 12 25 35 56 91 48 78 78 spadne d uzlu (27, 48) (27, 48, 78) prstřední klíč (48) se psune d rdičvskéh uzlu nvý křen 56 spadne d uzlu (78,91) (56, 78, 91) prstřední klíč (78) se přesune d rdičvskéh uzlu
Příklad knstrukce B- strmu (m=3) credit:wikipedia
B-strmvé indexy v DBS Hdnty slupce na kterém je pstaven index, tvří klíče uzlů indexu Data jsu ulžena puze v listech, případně jsu z listvých uzlů dkazvána (redundantní B-strm) Typicky B+-strmy, ve kterých jsu data na listvé úrvni prvázána busměrným spjvým seznamem (v případě MSSQL i na vnitřní úrvni) efektivní implementace rzsahvéh dtazu nalezení hraničníh bdu intervalu a sekvenční průchd listvu úrvní Víceslupcvé indexy přadí je určen hdntu prvníh slupce, v případě shdy rzhduje druhý slupec (atd.)
Klastrvaný vs neklastrvaný index Klastrvaný index Neklastrvaný index Indexvé stránky Datvé stránky
Vytvření a smazání indexu CREATE [UNIQUE] [CLUSTERED NONCLUSTERED] INDEX ixname ON tab(slupec1[, slupec2[, ]]) DROP INDEX ixname
Pužití indexu Index se pužije/nepužije autmaticky (pdle rzhdnutí ptimalizátru) Vytvářet indexy na čast dtazvaných slupcích Vytvářet index na cizích klíčích při JOINu při DELETE nadřazenéh klíče netřeba prjít sekvenčně tabulky s FK Index nepmůže u dtazu s nízku selektivitu (velikst výsledku ve srvnání s velikstí tabulky) Index klást na slupce, kde je předpklad diverzifikvané dmény Autmaticky vytvářené klíče PRIMARY KEY UNIQUE
Plán dtazu Způsb prvádění danéh dtazu, tj. přadí prvádění perací veducí k výsledné mnžině vrácené DB serverem uživateli Dtaz je převeden d relační algebry a následně je vytvřen strm vyhdncení dtazu
Spustí plán dtazu (samtný dtaz se nespustí) Zahrne d výsledku plán dtazu Plán dtazu
T-SQL Prcedurální rzšíření SQL Micrsft SQL Server - Transact-SQL Oracle PL/SQL Pstgres PL/pgSQL Mžnsti prměnné IF WHILE prcedury Funkce kurzry vyjímky transakce
Prměnné v T-SQL Každý výskyt prměnné uvzen @ Deklarace prměnné pmcí DECLARE datvé typy jsu splečné pr prměnné a slupce tabulek DECLARE @i INT; Přiřazení hdnty pmcí SET, SELECT SET @i = 1; SELECT @i = @i + 1; Výpis d knzli lze řešit prceduru PRINT PRINT @i Živtnst prměnné je mezena aktuální dávku (příkaz GO) DECLARE @i INT; SET @i = 1; GO PRINT @i;
Pdmínky v T-SQL IF pdmínka blk ELSE blk V rámci blku může být 1 příkaz, neb více uzavřených mezi BEGIN END V pdmínce lze využívat knstruktů známých z WHERE klauzule příkazu SELECT, tj. EXISTST, NOT NULL,. IF EXISTS(SELECT * FROM t WHERE cl1 > 10) BEGIN PRINT greater than PRINT greater than END ELSE PRINT less than
Datvý slvník v MSSQL datvý slvník bsahuje metadata ke všem bjektům v DB serveru V MSSQL přístup přes 2 schémata sys bsahuje phledy s detailními infrmacemi prakticky všech bjektech v DB INFORMATION_SCHEMA infrmace vyžadvané standardem SQL-92 méně pdrbné IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME= t ) DROP TABLE t; IF EXISTS (SELECT * FROM sys.tables WHERE name = t ) DROP TABLE t; IF OBJECT_ID( t ) IS NOT NULL DROP TABLE t;
Cykly v T-SQL WHILE pdminka {blk BREAK CONTINUE} V rámci blku může být 1 příkaz, neb více uzavřených mezi BEGIN END DECLARE @i INT; SET @i = 1; WHILE @i <= 10 BEGIN PRINT @i; SET @i = @i + 1; END
Vytvření prcedury Prcedura může zapuzdřvat prakticky libvlný T-SQL kód včetně DML příkazů CREATE PROCEDURE uspprc1 (@param1 INT, @param2 VARCHAR(30)) AS BEGIN tel_prcedury END CREATE PROCEDURE uspprc1 (@param1 INT, @param2 VARCHAR(30)) AS tel_prcedury GO
Vytvření prcedury Návratvé hdnty OUT parametry RETURN funguje puze pr datvý typ INTEGER CREATE PROCEDURE uspprc2 (@param1 INT, @param2 VARCHAR(30) OUTPUT) AS BEGIN END PRINT @param2; SET @param2 = @param1; RETURN @param1 + 1;
Vlání prcedury Prcedura je vlána pmcí příkazu EXECUTE Parametry jsu dděleny d jména prcedury mezeru a vzájemně čárku EXEC uspprc1 10, 'test' DECLARE @rv INT; DECLARE @param VARCHAR(30) = 'test'; EXEC @rv = uspprc2 5, @param OUT PRINT @rv PRINT @param