Prawie wszystkie funkcje na wiersz będą miały wpływ na wydajność, jedynym prawdziwym pytaniem jest:„Czy wpływ jest wystarczająco mały, aby się tym nie martwić?”.
To jest coś, co powinieneś odkryć, mierząc, a nie zgadując. Administrowanie bazą danych jest czynnością typu „ustaw i zapomnij”, jeśli ani Twoje dane, ani zapytania nigdy się nie zmienią. W przeciwnym razie należy okresowo monitorować wydajność, aby upewnić się, że nie wystąpią żadne problemy.
Przez „wystarczająco mały” w powyższych komentarzach mam na myśli, że prawdopodobnie nie musisz się martwić wpływem na wydajność czegoś takiego jak:
select * from friends where lowercase(lastname) = "smith"
jeśli masz tylko trzech przyjaciół.
Wpływ tych rzeczy staje się coraz poważniejszy, gdy stół powiększa się. Na przykład, jeśli masz sto milionów klientów i chcesz znaleźć wszystkich, którzy prawdopodobnie są związani z komputerami, nie chcesz próbować:
select name from customers where lowercase(name) like '%comp%'
To prawdopodobnie sprowadzi na ciebie DBA jak tona cegieł.
Jednym ze sposobów, w jaki naprawiliśmy to w przeszłości, jest wprowadzenie nadmiarowości w danych. Korzystając z tego pierwszego przykładu, dodamy dodatkową kolumnę o nazwie lowerlastname
i wypełnij go małą literą lastname
. Następnie zindeksuj go do celów wyszukiwania i select
wypowiedzi stają się oślepiająco szybkie, tak jak powinny.
A co to robi z naszym ukochanym 3NF, słyszę, jak pytasz? Odpowiedź brzmi „niewiele”, jeśli wiesz, co robisz :-)
Bazę danych można skonfigurować tak, aby ta nowa kolumna była wypełniana przez wyzwalacz wstawiania/aktualizacji, aby zachować spójność danych. Złamanie 3NF ze względu na wydajność jest całkowicie dopuszczalne, pod warunkiem, że zrozumiesz i złagodzisz konsekwencje.
Podobnie, drugie zapytanie może mieć wyzwalacz wstawiania/aktualizacji, który wypełnia nową indeksowaną kolumnę name_contains_comp
za każdym razem, gdy wpis został zaktualizowany lub wstawiony, który zawierał odpowiedni tekst.
Ponieważ większość baz danych jest czytana znacznie częściej niż jest zapisywana, powoduje to przeniesienie kosztu obliczeń na wstawianie/aktualizowanie, skutecznie amortyzując je we wszystkich wybranych operacjach. Zapytanie wyglądałoby wówczas tak:
select name from customers where name_contains_comp = 'Y'
Ponownie, zapytanie będzie oszałamiająco szybkie przy niewielkim koszcie nieco wolniejszego wstawiania i aktualizowania.