Почти всички функциите на ред ще окажат влияние върху производителността, единственият реален въпрос е:„Достатъчно малко ли е въздействието, за да не се притеснявате?“.
Това е нещо, което трябва да откриете, като измервате, вместо да гадаете. Администрирането на база данни е само дейност за настройване и забравяне, ако нито вашите данни, нито вашите заявки никога не се променят. В противен случай трябва периодично да наблюдавате производителността, за да сте сигурни, че няма да възникнат проблеми.
Под „достатъчно малък“ в горните коментари имам предвид, че вероятно няма нужда да се притеснявате за въздействието върху производителността на нещо като:
select * from friends where lowercase(lastname) = "smith"
ако имате само трима приятели.
Въздействието на тези неща става по-сериозно с увеличаването на размера на масата. Например, ако имате сто милиона клиенти и искате да намерите всички, които вероятно са свързани с компютър, не бихте искали да опитате:
select name from customers where lowercase(name) like '%comp%'
Това вероятно ще ви срине като един тон тухли.
Един от начините, по които сме коригирали това в миналото, е да въведем излишък в данните. Използвайки този първи пример, бихме добавили допълнителна колона, наречена lowerlastname
и го попълнете с малката стойност на lastname
. След това индексирайте това за целите на търсенето и вашият select
изявленията стават ослепително бързи, както трябва да бъдат.
И какво прави това с нашия много обичан 3NF, чух да попитате? Отговорът е "не много", ако знаете какво правите :-)
Можете да настроите базата данни, така че тази нова колона да се попълва от тригер за вмъкване/актуализация, за да поддържате последователност на данните. Напълно приемливо е да счупите 3NF от съображения за производителност, при условие че разбирате и смекчавате последствията.
По същия начин, тази втора заявка може да има тригер за вмъкване/актуализация, който попълва нова индексирана колона name_contains_comp
всеки път, когато е бил актуализиран или вмъкнат запис, който съдържа съответния текст.
Тъй като повечето бази данни се четат много по-често, отколкото се записват, това премества разходите за изчисление към вмъкване/актуализация, като ефективно ги амортизира във всички избрани операции. Тогава заявката ще бъде:
select name from customers where name_contains_comp = 'Y'
Отново ще откриете, че заявката е ослепително бърза с малка цена на малко по-бавни вмъквания и актуализации.