Eu tenho uma visão que combina várias tabelas via UNION ALL
e lida com alguns erros básicos com os dados. Devido à maneira como os erros são tratados, a visualização é um pouco mais lenta do que eu esperava. Existe alguma maneira de armazenar em cache a saída da exibição e atualizá-la dinamicamente sempre que qualquer uma das tabelas subjacentes for atualizada?
Algumas peculiaridades do meu sistema:
- O banco de dados só vê as atualizações uma vez por dia, fora do expediente. Portanto, uma solução com uso intensivo de recursos é boa, desde que os recursos sejam consumidos durante essas horas de folga.
- Devido à forma como o sistema está configurado, prefiro não limpar os dados durante o carregamento e prefiro deixar as tabelas subjacentes intocadas.
- Tenho índices de suporte apropriados configurados
- Todas as tabelas contêm registros distintos sem sobreposição, então preciso puxá-los todos
Algumas opções que considerei:
- Uma exibição indexada não funcionará porque a exibição depende do operador UNION.
- Não encontrei nenhuma maneira de armazenar em cache a saída de um TVF.
- Eu poderia criar uma tabela de cache e carregá-la manualmente a qualquer momento que a tabela subjacente fosse modificada, mas isso parece uma solução hacky. Acho que também teria que criar um SQL Agent Job para isso, pois configurá-lo como um gatilho envolveria atualizar a tabela milhões de vezes todas as noites enquanto a tabela é substituída.
- Eu poderia viver com o desempenho ruim, mas isso afetaria negativamente os usuários finais.
Aqui está um exemplo simplificado da visualização:
CREATE OR ALTER VIEW AllNamesAndAccountNumbers AS
SELECT
x.AccountNumber
, COALESCE(x.FullName, n.FullName) AS FullName
FROM (
SELECT
AccountNumber
, FullName
FROM TableWithNames
UNION ALL
SELECT
AccountNumber
, NULL AS FullName
FROM TableMissingNames
) x
LEFT JOIN NameMappings n -- this join is slow due to the table being really huge
ON n.AccountNumber = x.AccountNumber
Oh - se isso é um antipadrão, e eu deveria estar atacando isso de um ângulo fundamentalmente diferente, por favor, diga isso. Estou preocupado que estou olhando para isso errado.