Co se stane, když jednotkové testy přestanou stačit
Většina pomalých dotazů nevzniká kvůli slabému hardwaru, ale kvůli špatnému plánu provedení. Než začnete přidávat indexy nebo zvyšovat výkon serveru, zjistěte, co databáze skutečně dělá. Použijte příkaz EXPLAIN (nebo EXPLAIN ANALYZE) a sledujte, zda se používají indexy, jaký je přístup k tabulkám a kolik řádků se zpracovává. Bez tohoto kroku ladíte naslepo.
Kdy index pomůže a kdy naopak uškodí Index zrychluje vyhledávání podle sloupce v WHERE, JOIN nebo ORDER BY, ale zpomaluje zápisy (INSERT, UPDATE, DELETE), protože se musí aktualizovat i indexová struktura. Proto neindexujte každý sloupec. Zaměřte se na sloupce s vysokou selektivitou – tedy takové, které vrací malé procento řádků. Sloupec s pohlavím (dvě hodnoty) obvykle není vhodný kandidát. Naopak kombinovaný index na (zakaznik_id, datum) může výrazně pomoci u dotazů filtrujících podle obou.
Začni tím, že si v projektu spustíš git init. Tím vznikne skrytý adresář .git, kam se ukládá veškerá historie. Potom přidej soubory do indexu pomocí git add a ulož je příkazem git commit -m "popis změny". Pozor na typickou chybu: lidé napíšou git commit bez předchozího git add a diví se, že se nic neuložilo. Index funguje jako přípravná zóna – co tam nedáš, to se necommitne.
Zásadní je definovat hranici mezi jednotkovým a integračním testem. Jednotkový test ověřuje jednu logickou jednotku bez vedlejších efektů – typicky funkci nebo metodu s izolovanými závislostmi. Integrační test naopak ověřuje spolupráci dvou a více reálných komponent: například úložiště s databází, řadič s validátorem nebo službu s HTTP klientem. Pokud tuto hranici nemáte pojmenovanou, začnou vznikat „testy nanečisto", které jsou pomalé, křehké a nikdo neví, co vlastně ověřují.
Proměnné deklarujte s jasným typem. int pro celá čísla, double pro desetinná, string pro text, bool pro pravdivostní hodnotu. C# je staticky typovaný, takže do proměnné typu int nelze uložit text bez převodu. Kompilátor to odmítne a je to výhoda, ne překážka. Zkuste malý program: načtěte dvě čísla, sečtěte je a výsledek vypište. Teprve na takovém cvičení pochopíte, jak spolu souvisí vstup, převod a výstup.
Základní ochranou je oddělit data od příkazů. V praxi to znamená používat parametrizované dotazy nebo připravené příkazy. Hodnota se předá databázovému ovladači zvlášť a ten ji ošetří podle svého typu. Není potřeba ručně escapovat uvozovky ani spoléhat na to, že vstup „vypadá bezpečně". Parametrizace řeší řetězce, čísla i data. Pokud jazyk nebo knihovna podporují pojmenované parametry, používej je přednostně před otazníky, protože je méně snadné splést pořadí hodnot.
Až bude program fungovat, prohlédněte si strukturu souboru. Metoda Main je statická, protože ji běhové prostředí volá bez instance třídy. Třída obalující Main se jmenuje podle souboru, ale jméno můžete změnit, aniž by se cokoli rozbilo. Naopak změna názvu souboru mimo projekt může rozhodit sestavení. Pokud přidáte další metodu, musí být také statická, jinak ji z Main nezavoláte přímo. Toto pravidlo odhalí mnoho začátečnických zmatků během několika sekund.
Vzdálený repozitář není automatická záloha. git push odešle commity, git pull stáhne cizí změny. Pokud push odmítne s hláškou o nesouhlasných historiích, neznamená to, že máš použít --force. Nejdřív si přečti, co je na serveru nového, a sluč. Vynucený push přepíše práci ostatních a v týmovém prostředí je to nejrychlejší cesta k rozbitému projektu. Pro začátek stačí pamatovat: commituj často, ale po malých ucelených změnách, a před každým push si projdi git log --oneline, ať víš, co odesíláš.
Nauč se také číst stav repozitáře. Příkaz git status ti ukáže, co je změněné, co je v indexu a co ještě není sledované. git log --oneline zobrazí historii commitů stručně. Bez těchto dvou příkazů budeš tápat. Zvykni si kontrolovat stav před každým commitem – ušetří to mnoho zbytečných oprav.
Mezi nejčastější chyby patří commitování velkých nebo citlivých souborů. Do repozitáře nepatří hesla, klíče ani dočasné soubory. Vytvoř soubor .gitignore a vypiš do něj vzory, které má Git ignorovat. Další častá chyba je práce přímo v hlavní větvi bez zálohy. Pokud něco pokazíš, můžeš sice použít git reset nebo git revert, ale je snazší mít změny na samostatné větvi a jen je sloučit, až fungují.
Nakonec sledujte statistiky a cache. Zastaralé statistiky vedou k odhadům, které neodpovídají realitě, a optimizér zvolí špatný plán. Pravidelně spouštějte aktualizaci statistik. Pokud se dotaz opakuje, databáze si ho může naplánovat znovu – pomoci může příprava dotazu (prepared statement) nebo plánovací rady. Bez měření a porozumění plánu ale žádná magie nefunguje.