Téměř vše funkce na řádky budou mít dopad na výkon, jediná skutečná otázka zní:„Je dopad dostatečně malý na to, abyste si s ním nedělali starosti?“.
To je něco, co byste měli objevit spíše měřením než hádáním. Správa databáze je činnost nastavená a zapomenutá pouze v případě, že se vaše data ani vaše dotazy nikdy nezmění. V opačném případě byste měli pravidelně sledovat výkon, abyste zajistili, že nenastanou žádné problémy.
Výrazem „dost malý“ ve výše uvedených komentářích myslím, že se pravděpodobně nemusíte obávat dopadu na výkon něčeho jako:
select * from friends where lowercase(lastname) = "smith"
pokud máte jen tři přátele.
Dopad těchto věcí se stává vážnější, jak se stůl zvětšuje. Pokud máte například sto milionů zákazníků a chcete najít všechny, kteří pravděpodobně souvisejí s počítačem, nechtěli byste to zkoušet:
select name from customers where lowercase(name) like '%comp%'
To na vás pravděpodobně stáhne vaše DBA jako tuny cihel.
Jedním ze způsobů, jak jsme to v minulosti opravili, je zavedení redundance do dat. Pomocí tohoto prvního příkladu bychom přidali další sloupec nazvaný lowerlastname
a naplňte jej malou hodnotou lastname
. Pak to indexujte pro účely vyhledávání a select
prohlášení se stávají oslnivě rychlými, jak by měly být.
A co to udělá s naším tolik milovaným 3NF, slyšel jsem, že se ptáš? Odpověď je "nic moc", pokud víte, co děláte :-)
Databázi můžete nastavit tak, aby byl tento nový sloupec naplněn spouštěčem vložení/aktualizace, aby byla zachována konzistence dat. Je naprosto přijatelné rozbít 3NF z výkonnostních důvodů za předpokladu, že rozumíte a zmírňujete následky.
Podobně by tento druhý dotaz mohl mít spouštěč vložení/aktualizace, který vyplní nový indexovaný sloupec name_contains_comp
kdykoli byl aktualizován nebo vložen záznam obsahující relevantní text.
Vzhledem k tomu, že většina databází je mnohem častěji čtena, než zapisována, přesouvá se tím náklady na výpočet na vložení/aktualizaci a efektivně je amortizuje ve všech vybraných operacích. Dotaz by pak byl:
select name from customers where name_contains_comp = 'Y'
Opět zjistíte, že dotaz bude oslnivě rychlý za menší náklady na mírně pomalejší vkládání a aktualizace.