Praticamente todos funções por linha terão um impacto no desempenho, a única pergunta real é:"O impacto é pequeno o suficiente para não se preocupar?".
Isso é algo que você deve descobrir medindo em vez de adivinhar. A administração do banco de dados é apenas uma atividade definida e esquecida se nem seus dados nem suas consultas forem alterados. Caso contrário, você deve monitorar periodicamente o desempenho para garantir que não ocorram problemas.
Por "pequeno o suficiente" nos comentários acima, quero dizer, você provavelmente não precisa se preocupar com o impacto no desempenho de algo como:
select * from friends where lowercase(lastname) = "smith"
se você tiver apenas três amigos.
O impacto dessas coisas se torna mais sério à medida que a mesa aumenta de tamanho. Por exemplo, se você tem cem milhões de clientes e deseja encontrar todos os que provavelmente estão relacionados a computadores, não tente:
select name from customers where lowercase(name) like '%comp%'
Isso provavelmente derrubará seus DBAs em você como uma tonelada de tijolos.
Uma maneira de corrigir isso no passado é introduzir redundância nos dados. Usando esse primeiro exemplo, adicionaríamos uma coluna extra chamada
lowerlastname
e preencha-o com o valor minúsculo de lastname
. Em seguida, indexe isso para fins de pesquisa e seu select
declarações tornam-se incrivelmente rápidas, como deveriam ser. E o que isso faz com o nosso muito amado 3NF, eu ouço você perguntar? A resposta é "não muito", se você sabe o que está fazendo :-)
Você pode configurar o banco de dados para que essa nova coluna seja preenchida por um gatilho de inserção/atualização, para manter a consistência dos dados. É perfeitamente aceitável quebrar a 3NF por motivos de desempenho, desde que você entenda e mitigue as consequências.
Da mesma forma, essa segunda consulta pode ter um gatilho de inserção/atualização que preencheu uma nova coluna indexada
name_contains_comp
sempre que uma entrada foi atualizada ou inserida que continha o texto relevante. Como a maioria dos bancos de dados é lida com muito mais frequência do que gravada, isso transfere o custo do cálculo para a inserção/atualização, amortizando-o efetivamente em todas as operações selecionadas. A consulta seria então:
select name from customers where name_contains_comp = 'Y'
Novamente, você encontrará a consulta incrivelmente rápida com o menor custo de inserções e atualizações um pouco mais lentas.