Aqui está algo que eu faço. Não resulta em tempo de inatividade zero, mas pode terminar em menos de um segundo.
Crie um banco de dados que tenha apenas elementos de interface para seu banco de dados real. No meu caso, ele contém apenas definições de visualização e todas as consultas do usuário passam por esse banco de dados.
Crie um novo banco de dados a cada noite. Quando terminar, atualize as definições de exibição para fazer referência ao novo banco de dados. Eu recomendaria desativar o acesso do usuário ao banco de dados que contém as visualizações enquanto você as atualiza ou excluir todas as visualizações e recriá-las - isso impede o acesso parcial ao banco de dados antigo. Como a criação de visualizações é rápida, essa deve ser uma operação muito rápida.
Fazemos tudo isso através de um trabalho. Na verdade, antes de alterar as visualizações de produção, testamos a criação da visualização em outro banco de dados para ter certeza de que todas estão funcionando.
Obviamente, se você usar
alter view
em vez de exigir consistência em todas as visualizações, não há tempo de inatividade, apenas um breve período de inconsistência.