Eu tenho uma tabela grande (dezenas a centenas de milhões de registros) que dividimos por motivos de desempenho em tabelas ativas e de arquivamento, usando um mapeamento de campo direto e executando um processo de arquivamento todas as noites.
Em vários lugares do nosso código, precisamos executar consultas que combinam as tabelas ativas e de arquivamento, quase invariavelmente filtradas por um ou mais campos (nos quais obviamente colocamos índices nas duas tabelas). Por conveniência, faria sentido ter uma visão como esta:
create view vMyTable_Combined as
select * from MyTable_Active
union all
select * from MyTable_Archive
Mas se eu executar uma consulta como
select * from vMyTable_Combined where IndexedField = @val
ele fará a união em tudo, desde Active e Store antes de filtrar @val
, o que prejudicará o desempenho.
Existe alguma maneira inteligente de fazer com que as duas subconsultas da união visualizem cada filtro @val
antes de criar a união?
Ou talvez exista alguma outra abordagem que você sugerir que atinja o que pretendo, ou seja, uma maneira fácil e eficiente de obter o conjunto de registros da união, filtrado pelo campo indexado?
EDIT: aqui está o plano de execução (e você pode ver os nomes das tabelas reais aqui):
Curiosamente, a tabela ativa está realmente usando o índice correto (mais uma pesquisa de RID?), Mas a tabela de arquivamento está fazendo uma varredura de tabela!