Prácticamente todo las funciones por fila tendrán un impacto en el rendimiento, la única pregunta real es:"¿Es el impacto lo suficientemente pequeño como para no preocuparse?".
Esto es algo que debe descubrir midiendo en lugar de adivinar. La administración de la base de datos es solo una actividad de configurar y olvidar si ni sus datos ni sus consultas cambian nunca. De lo contrario, debe monitorear periódicamente el rendimiento para asegurarse de que no ocurran problemas.
Por "lo suficientemente pequeño" en los comentarios anteriores, quiero decir que probablemente no deba preocuparse por el impacto en el rendimiento de algo como:
select * from friends where lowercase(lastname) = "smith"
si solo tienes tres amigos.
El impacto de estas cosas se vuelve más serio a medida que la mesa aumenta de tamaño. Por ejemplo, si tiene cien millones de clientes y desea encontrar todos los que probablemente estén relacionados con la informática, no querrá probar:
select name from customers where lowercase(name) like '%comp%'
Es probable que eso derribe a sus DBA como una tonelada de ladrillos.
Una forma en que solucionamos esto en el pasado es introducir redundancia en los datos. Usando ese primer ejemplo, agregaríamos una columna adicional llamada lowerlastname
y rellénelo con el valor en minúsculas de lastname
. Luego indexe eso para propósitos de búsqueda y su select
las declaraciones se vuelven deslumbrantemente rápidas, como deberían ser.
¿Y qué le hace eso a nuestra muy querida 3NF, te escucho preguntar? La respuesta es "no mucho", si sabes lo que estás haciendo :-)
Puede configurar la base de datos para que esta nueva columna se llene con un activador de inserción/actualización, para mantener la coherencia de los datos. Es perfectamente aceptable romper 3NF por motivos de rendimiento, siempre que comprenda y mitigue las consecuencias.
De manera similar, esa segunda consulta podría tener un disparador de inserción/actualización que llenó una nueva columna indexada name_contains_comp
cada vez que se actualizaba o insertaba una entrada que contenía el texto relevante.
Dado que la mayoría de las bases de datos se leen con mucha más frecuencia de lo que se escriben, esto mueve el costo del cálculo a la inserción/actualización, amortizándolo efectivamente en todas las operaciones de selección. La consulta sería entonces:
select name from customers where name_contains_comp = 'Y'
Una vez más, encontrará que la consulta es deslumbrantemente rápida al costo menor de inserciones y actualizaciones un poco más lentas.