Optimalizácia výkonu v MS SQL Management Studio
Optimalizáciu databázy vykonávame väčšinou pridaním databázového indexu na stĺpec alebo skupinu stĺpcov, ktoré často figurujú v podmienkach otázok. Optimalizácia sa často vykonáva až po vytvorení aplikácie a to iba pri dotazoch, ktoré trvajú dlho alebo sa spúšťajú veľmi často (vygenerovanie stránky trvá dlhšie ako 500ms). Nemá zmysel plytvať časom vývojárov na optimalizáciu dotazu, ktorý sa spúšťa len zriedka. Z mojich skúseností je možné ušetriť čas hlavne na strane serverového jazyka (napr. PHP je veľmi pomalé) ako na strane databázy, ktoré bývajú väčšinou veľmi rýchle.
Pri optimalizácii databázy postupujeme nasledovne:
Obvykle sa najskôr pozrieme, či je otázka v poriadku a či by sa nedala vyriešiť lepšie. Občas sa pozeráme na problém zo zlého uhla a zbytočne by sme optimalizovali zlý dotaz, keď sa môže položiť inak.
Ďalej skontrolujeme prítomnosť databázových indexov, pokiaľ poznáte teóriu okolo vyhľadávacích algoritmov (stromov), určite viete, že to má na výkon obrovský vplyv.
Pokiaľ máme s aplikáciou stále výkonnostné problémy, môžeme pristúpiť k tzv. denormalizácii, kedy spojíme 2 alebo viac tabuliek do jednej, aby sme sa vyhli JOINovaniu. Takáto operácia má potom samozrejme nepriaznivý vplyv na návrh aplikácie. Bohužiaľ často platí nepriama úmernosť medzi pekne napísanou aplikáciou (mienené po stránke zdrojového kódu) a rýchlou aplikáciou.
My si tu ukážeme najčastejší spôsob optimalizácie pridaním indexu na stĺpec. Opäť nadviažeme na náš vzdelávací projekt a vymyslíme si s ním výkonnostný problém.
Problém
Po niekoľkých mesiacoch prevádzky sa výrazne zvýšila záťaž servera a nastala potreba túto situáciu riešiť. Najčastejšou otázkou je zobrazenie obsahu článku podľa stĺpca PrettyURL. Táto hodnota sa serveru odošle ako parameter v GET a server podľa neho nájde a vráti požadovaný článok. K tomuto stĺpcu nie je priradený žiadny index, čo sa podpisuje na výkone aplikácie.
Pridanie databázového indexu
Hoci sa na testovacích dátach zrejme neprejaví žiadna zmena, rád by som
načrtol, ako by optimalizácia prebiehala na skutočných dátach. V nástroji
SQL Server Management Studio spustíme dotaz na výber článku podľa PrettyURL
a necháme si vygenerovať Execution plan pomocou tlačidla
:
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ýsledok bude vyzerať napr. takto:
A jednotlivé parametre:
Následne vytvoríme index na stĺpci PrettyURL:
CREATE INDEX idx_clanek_prettyurl ON Clanek (PrettyURL);
Opätovné vyvolanie Execution plan by na ostrej databáze, ktorá by určite mala niekoľko desiatok MB, určite prinieslo výrazné zmeny. Na testovacích dátach sa zmena vôbec neprejaví, ale sme si to aspoň vyskúšali:)