Eu tenho várias colunas que armazenam dados que podem conter alguns caracteres extras para formatação/agrupamento. Pense em espaços em branco e traços em dados como números de telefone e números de placas.
Ao consultar, não podemos ter certeza se e onde esses traços estão presentes, então precisamos removê-los da coluna. Fazer isso durante a consulta não é ótimo para o desempenho, então quero criar uma coluna computada para a coluna removida e colocar um índice nela.
-- trimming the length down to 50 characters
-- which is the length of the original field
ALTER TABLE foo
ADD search_license_plate AS (LEFT(REPLACE(license_plate, '-', ''), 50));
CREATE INDEX ix_foo_search_license_plate ON foo(search_license_plate);
Essas colunas computadas são sempre precisas, portanto, não precisam ser persistidas devido à falta de precisão.
Os dados normalmente serão inseridos apenas uma vez e raramente serão alterados. Nunca em grandes volumes, então não me importo muito com qualquer impacto no desempenho de persistir a coluna.
Além disso, a coluna computada nunca será retornada de uma consulta; ele só será usado em condições na consulta, normalmente
SELECT
foo.id,
foo.license_plate
FROM foo
WHERE foo.search_license_plate LIKE '%bar%';
... embora eu não possa garantir que não haverá nada SELECT *
feito nessas mesas.
Existe alguma necessidade de persistir essas colunas?