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


středa 5. listopadu 2014

FastCube - Analytický reporting

FastCube2 for VCL

Spolu s novou verzí vývojových nástrojů společnosti Embarcadero získávají vývojáři jako bonus také produkt FastCube. Jedná se sadu VCL komponent, která umožňuje vývojářům doplnit své aplikace o funkce základní datové analýzy.
Na rozdíl od klasických výstupních sestav, které jsou statické, umožňuje FastCube uživatelům analyzovat závislost zkoumané veličiny na nejrůznějších faktorech jako je místo, čas atd. FastCube poskytuje intuitivní rozhraní pro dynamickou konfiguraci sestavy, rozpad ("drill down") agregovaných dat, filtrování nebo použití jednoduchých kalkulací.

Datová kostka

FastCube umí pracovat jak s daty z databázového stroje, tak s daty uloženými v souboru. Pro složitější analýzy je vhodné si data "upravit".
Struktura dat používaná běžnými provozními systémy je totiž optimalizovaná především pro zabezpečení nekonfliktního zpracování vysokého počtu obchodních operací pro často velké množství současně pracujících uživatelů.
Datová kostka (Cube) je specifická datová struktura, která naopak za cenu redundance dat zjednodušuje a také urychluje analytické "dotazování". Můžeme si ji zjednodušeně představit jako tabulku, která obsahuje každou změnu sledované metriky (faktu) a hodnotu pro každý parametr (dimenzi). Dimenze mohou být dále členěny pro práci s agregovanými údaji (hierarchie).

Zakladní termíny

Výsledná datová kostka může vypadat následovně:

Schéma použité datové kostky

Demo aplikace

Na následujícím příkladu si ukážeme vytvoření jednoduchého formuláře pro analýzu dat za použití komponent FastCube. Na formulář umístíme následující komponenty:
fcxCube - udržuje v paměti datovou sadu reprezentující datovou kostku.
fcxCubeGrid - Datová mřížka pro zobrazení záznamů datové kostky.
fcxCubeGridToolbar - Nástrojová lišta pro práci s datovou kostkou. Bez jediného řádku kódu zpřístupňuje všechny základní funkce jako uložení dat do souboru, načtení dat, tvorbu řezů (Slicing), Filtrování apod. 
fcxSlice - Datová sada pro definovaný řez datovou kostkou. 
fcxSliceGrid - Specializovaná datová mřížka pro řezy. Kromě vlastního zobrazení umožňuje také vizuální návrh řezu nad definovanou datovou kostkou.
fcxSliceGridToolbar - Nástrojová lišta pro řezy datovou kostkou.
fcxDefaultSettings - Dialog pro uživatelská nastavení základních parametrů FastCube, jako je formátování dat nebo nastavení datových mřížek.
fcxDataSource - Komponenta pro nastavení datového zdroje.
fcxDBDataSet - Umožňuje namapovat datové sady definované pomocí standardních technologií pro připojení k databázím.

Návrhový formulář aplikace

Nyní aplikaci "oživíme" nastavením příslušných vlastností jednotlivých komponent. Základní propojení zachycuje následující schéma. V tomto konkrétním případě byla pro připojení k DB použita technologie FireDAC (žlutě označené). FastCube ale podporuje i DBExpress, IBExpress nebo DBGo. 
Zapojení použitých komponent

Práce s aplikací

Po zkompilování aplikace (nebyl použit jediný řádek kódu!) můžeme začít s "analýzou" dat. Na ukázku práce s rozhraním FastCube se můžete podívat zde:

 

Spolu s FastCube lze použít komponenty TeeChart pro ještě lepší vizualizaci dat.