Stort set alt funktioner pr. række vil have en indvirkning på ydeevnen, det eneste rigtige spørgsmål er:"Er påvirkningen lille nok til ikke at bekymre dig om?".
Dette er noget, du bør opdage ved at måle i stedet for at gætte. Databaseadministration er kun en sæt-og-glem-aktivitet, hvis hverken dine data eller dine forespørgsler nogensinde ændres. Ellers bør du jævnligt overvåge ydeevnen for at sikre, at der ikke opstår problemer.
Med "lille nok" i ovenstående kommentarer mener jeg, at du sandsynligvis ikke behøver bekymre dig om virkningen af ydeevnen af noget som:
select * from friends where lowercase(lastname) = "smith"
hvis du kun har tre venner.
Virkningen af disse ting bliver mere alvorlig, efterhånden som bordet øges i størrelse. For eksempel, hvis du har hundrede millioner kunder, og du vil finde alle dem, der sandsynligvis er computerrelaterede, ville du ikke prøve:
select name from customers where lowercase(name) like '%comp%'
Det vil sandsynligvis bringe dine DBA'er ned over dig som et væld af klodser.
En måde, vi har rettet dette på tidligere, er at introducere redundans i dataene. Ved at bruge det første eksempel ville vi tilføje en ekstra kolonne kaldet lowerlastname
og udfyld den med små bogstaver lastname
. Indekser derefter det til søgeformål og din select
udtalelser bliver blændende hurtige, som de burde være.
Og hvad gør det ved vores højt elskede 3NF, hører jeg dig spørge? Svaret er "ikke meget", hvis du ved, hvad du laver :-)
Du kan konfigurere databasen, så denne nye kolonne udfyldes af en indsættelses-/opdateringsudløser, for at bevare datakonsistensen. Det er helt acceptabelt at bryde 3NF af præstationsmæssige årsager, forudsat at du forstår og afbøder konsekvenserne.
På samme måde kunne den anden forespørgsel have en indsættelses-/opdateringstrigger, der udfyldte en ny indekseret kolonne name_contains_comp
hver gang en post blev opdateret eller indsat, som indeholdt den relevante tekst.
Da de fleste databaser læses langt oftere, end de er skrevet, flytter dette omkostningerne ved beregningen til indsættelsen/opdateringen, hvilket effektivt afskriver dem på tværs af alle udvalgte operationer. Forespørgslen ville så være:
select name from customers where name_contains_comp = 'Y'
Igen, du vil finde forespørgslen blændende hurtigt til de mindre omkostninger ved lidt langsommere indsættelser og opdateringer.