Optimalizace výkonu v MS SQL Management Studio

C# .NET Databáze Optimalizace výkonu v MS SQL Management Studio

Optimalizaci databáze provádíme většinou přidáním databázového indexu na sloupec nebo skupinu sloupců, které často figurují v podmínkách dotazů. Optimalizace se často provádí až po vytvoření aplikace a to pouze u dotazů, které trvají dlouho nebo se spouští velmi často (vygenerování stránky trvá déle, než 500ms). Nemá smysl plýtvat časem vývojářů na optimalizaci dotazu, který se spouští jen zřídka. Z mých zkušeností lze ušetřit čas hlavně na straně serverového jazyka (např. PHP je velmi pomalé) než na straně databáze, které bývají většinou velmi rychlé.

U optimalizace databáze postupujeme následovně:

Obvykle se nejprve podíváme, zda je dotaz v pořádku a zda by nešel vyřešit lépe. Občas se díváme na problém ze špatného úhlu a zbytečně bychom optimalizovali špatný dotaz, když se může položit jinak.

Dále zkontrolujeme přítomnost databázových indexů, pokud znáte teorii okolo vyhledávacích algoritmů (stromů), určitě víte, že to má na výkon obrovský vliv.

Pokud máme s aplikací stále výkonnostní problémy, můžeme přistoupit k tzv. denormalizaci, kdy spojíme 2 nebo více tabulek do jedné, abychom se vyhnuli JOINování. Takováto operace má potom samozřejmě nepříznivý vliv na návrh aplikace. Bohužel často platí nepřímá úměrnost mezi hezky napsanou aplikací (míněno po stránce zdrojového kódu) a rychlou aplikací.

My si zde ukážeme nejčastější způsob optimalizace a to přidáním indexu na sloupec. Opět navážeme na náš vzdělávací projekt a vymyslíme si s ním výkonnostní problém.

Problém

Po několika měsících provozu se výrazně zvýšila zátěž serveru a nastala potřeba tuto situaci řešit. Nejčastějším dotazem je zobrazení obsahu článku podle sloupce PrettyURL. Tato hodnota se serveru odešle jako parametr v GET a server podle něj nalezne a vrátí požadovaný článek. K tomuto sloupci není přiřazen žádný index, což se podepisuje na výkonu aplikace.

Přidání databázového indexu

Ačkoli se na testovacích datech patrně neprojeví žádná změna, rád bych nastínil, jak by optimalizace probíhala na skutečných datech. V nástroji SQL Server Management Studio spustíme dotaz na výběr článku dle PrettyURL a necháme si vygenerovat Execution plan pomocí tlačítka Tlačítko pro vygenerování exekučního plánu:

SELECT
        c.Perex,
        c.PrettyURL,
        c.Keywords,
        c.Titulek,
        c.Obsah,
        c.Publikovano,
        u.Nick
FROM Clanek c, Uzivatel u
WHERE ((c.PrettyURL = 'co-je-to-algoritmus')
        AND (c.AutorID = u.UzivatelID));

Výsledek bude vypadat např. takto:

Exekuční plán v Microsoft SQL Management Studio

A jednotlivé parametry:

Parametry exekučního plánu v Microsoft SQL Management Studio

Následně vytvoříme index na sloupci PrettyURL:

CREATE INDEX idx_clanek_prettyurl ON Clanek (PrettyURL);

Opětovné vyvolání Execution plan by na ostré databázi, která by jistě měla několik desítek MB, jistě přineslo výrazné změny. Na testovacích datech se změna vůbec neprojeví, nicméně jsme si to alespoň vyzkoušeli :)


 

  Aktivity (1)

Článek pro vás napsal David Čápka
Avatar
Autor pracuje jako softwarový architekt a pedagog na projektu ITnetwork.cz (a jeho zahraničních verzích). Velmi si váží svobody podnikání v naší zemi a věří, že když se člověk neštítí práce, tak dokáže úplně cokoli.
Unicorn College Autor se informační technologie naučil na Unicorn College - prestižní soukromé vysoké škole IT a ekonomie.

Jak se ti líbí článek?
Celkem (4 hlasů) :
3.253.253.25 3.253.25


 



 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!