Google+ Followers

pátek 7. listopadu 2014

Optimalizace na straně serveru

DB Optimizer

Při práci s jazykem SQL se většinou soustředíme především na faktickou správnost, tedy aby jednotlivé příkazy vykonávaly to, co je od nich očekáváno a výsledkové sady obsahovaly právě jen data, která obsahovat mají. Syntaktická správnost příkazů je samozřejmostí, protože ji jednak ověřuje databázový stroj a většina vývojářů již dnes používá některý z mnoha SQL editorů, které podporují grafický návrh, inteligentní dokončování příkazů, automaticky nabízí existující databázové objekty nebo generují uložené procedury.
Co již není takovou samozřejmostí, je optimalizace SQL kódu z pohledu výkonu (doby odezvy). Přitom právě rychlost, s jakou aplikace reaguje na požadavky uživatele, často zásadně ovlivňuje uživatelský komfort.
Nejen pro vývojáře pracující s Delphi nebo C++ Builderem nabízí společnost Embarcadero nástroj DB Optimizer. K dispozici je zde nabídka tří základních scénářů, podle kterých lze při optimalizaci databázových operací postupovat.

Ladění jednotlivých SQL příkazů

Tento přístup umožňuje odstranit řadu výkonnostních problémů již v průběhu vývoje. Každý příkaz, který napíšeme nebo vygenerujeme, lze v prostředí DB Optimizeru okamžitě optimalizovat.

DB Optimizer potřebuje mít pro svou práci možnost komunikovat s příslušným databázovým strojem. Nejprve je tak třeba definovat parametry připojení. Kromě obvyklých atributů jako je adresa, port, jméno databáze nebo přístupové údaje můžeme nastavit i řadu pokročilých vlastností. Jednotlivé datové zdroje lze kategorizovat. Uživatel tak může být například okamžitě vyrozuměn o tom, že se připojil nikoliv k testovací, ale k produkční databázi.

Nastavení připojení k databázi

Po připojení k DB můžeme zahájit vlastní ladění. Z hlavní nabídky otevřeme novou úlohu ("Tuning Job") a zadáme SQL pro ladění. Můžeme jej zadat přímo, načíst ze souboru nebo extrahovat z připojené databáze.

Načtení SQL příkazů


DB Optimizer načte určené příkazy do seznamu. Zkontrolujeme, že jsou zatrženy volby "Generate cases" a "Perform detail analysis". Nyní klinutím na ikonu "Run Job" zahájit vlastní analýzu.

Přehled příkazů pro ladění


Příkazy jsou podrobeny výkonnostní analýze a DB Optimizer navrhne možné alternativy spolu s podrobnou statistikou týkající se vypočtených nákladů na jejich zpracování. DB Optimizer tvoří jednotlivé varianty jak změnami ve vlastním SQL kódu, tak použitím různých kombinací indexů či nastavení optimalizeru za pomoci takzvaných "Hintů". Všechny možnosti jsou přehledně zobrazeny od nejrychlejší po nejpomalejší.

Hint - Způsob provedení příkazu určuje optimalizer, který je součástí databázového stroje. Velký vliv na konkrétní "strategii" mají statistiky (viz níže). Hint je parametr použitý v SQL kódu, který umožňuje serveru "vnutit" požadované chování. Tuto možnost je třeba používat velmi obezřetně.

Přehled alternativ


Po tom, co si ze seznamu vybereme alternativu, s kterou chceme dále pracovat a kliknutím na tlačítko "Analysis" zobrazíme její detailní analýzu. K dispozici máme text příkazu, grafický rozbor jeho exekučního plánu včetně vlivu existujících i zatím nevytvořených indexů.

Exekuční plán - informace v textové nebo grafické podobě vysvětlující jak bude (nebo byl) realizován příkaz odesílaný databázovému stroji. Typicky obsahuje jednotlivé kroky (operace), způsob jejich provedení a počet dotčených záznamů. Podrobnější plány obsahují také informace o očekávaných nákladech (costs). Ty se týkají I/O operací, zatížení CPU, způsobu přístupu k datům (TABLE/INDEX SCAN, SEEK) či operátorů spojení (LOOP, NESTED LOOP, MERGE, HASH) a dalších charakteristik v závislosti na konkrétním typu databázového stroje.

Exekuční plán


Indexy, které by měli na rychlost zpracování pozitivní vliv lze vytvořit přímo z prostředí DB Optimizeru.

Vytvoření indexu


Přesnost analýzy je samozřejmě závislá na aktuálnosti dostupných statistik. Ty si jak na úrovni tabulek tak sloupců můžeme nejen zobrazit a procházet, ale přímo si také vynutit jejich aktualizaci na straně serveru.

Databázové statistiky


Databázové statistiky - Jedná se o informace o povaze uložených dat. Patří sem například informace typu maximální/minimální hodnoty, denzita, selektivita, kardinalita či přehled distribuce hodnot (histogram). Metadata tohoto typu se mohou velmi dynamicky měnit a je tak třeba je udržovat co možná nejaktuálnější.

Profilování zátěže databázového serveru

V reálné světě má uživatel aplikace jen zřídka databázový server k dispozici jen sám pro sebe. V konkurenčním prostředí se mohou i příkazy, které mají při izolovaném spouštění rychlou odezvu, ukázat jako problematické. Do hry zde totiž vstupují i další vlivy jako jsou zamykání, propustnost sítě a podobně.
Profilování lze provádět během vývoje a testování aplikace, velmi užitečné ale může být i pro odhalení výkonostních problémů při jejím nasazování a provozu.

Při profilování se sleduje a ukládá řada výkonnostních charakteristik.

Okno profilování


Výstupy lze následně filtrovat podle kritérií jako je název aplikace, jméno uživatele, typu příkazu a řady dalších.

Filtrování výstupů

Generování zátěže

V případě, že ladíme stávající aplikaci, postarají se o zátěž reální uživatelé. Profileru pak stačí pouze zadat časové rozmezí, v kterém má sbírat potřebné výkonnostní metriky. U testování aplikací, které nasazení do provozu teprve čeká, je třeba zátěž nějakým způsobem generovat. DBOptimizer umožňuje připravit soubory SQL příkazů a ty následně paralelně spouštět.
Nastavit lze počet paralelních vláken, požadovaný počet opakování, ale i od kdy a po jak dlouhou dobu má být zátěž generována.

Generování zátěže

Narozdíl od některých konkurenčních nástrojů není třeba mít pro každý databázový stroj jiný produkt, ale DB různých dodavatelů lze optimalizovat je jediného prostředí. DB Optimizer podporuje databázové stroje

  • Oracle 9i, 10g, 11g a 12c
  • Sybase ASE 12.5 – 15.7
  • IBM DB2 LUW 9-9.7
  • Microsoft SQL Server 2005, 2008 a 2012