Eu tenho duas tabelas, vamos chamá-las de TableA e TableB.
TableA TableB
------ ------
ID ID
Date Date
Foo Bar
Ambas as tabelas possuem um índice em seu campo de data. Agora, quero criar uma exibição que tenha uma junção externa completa entre as duas tabelas no campo Data, para me mostrar o Foo
valor dessa data (se houver) junto com o valor Bar
dessa data.
create view vFooBar as
select isnull(a.Date, b.Date) Date, a.Foo, b.Bar
from TableA a
full outer join TableB b on a.Date = b.Date
Então eu executo uma consulta:
select * from vFooBar where Date = '20141201'
Isso funciona ... mas a união a.Date
e b.Date
engana o compilador para não usar os índices, e recebo um plano de execução horrível envolvendo varreduras de tabela.
Como posso criar essa exibição de forma que a consulta ainda use meus índices?
Tente isso
Estritamente falando, a consulta acima não tem exatamente a mesma semântica da junção completa original, com relação a duplicatas. Uma transformação correta de junção completa é para uma união de junção esquerda, toda anti-semi-junção:
Essa segunda reescrita também facilitará o uso de um índice nas
TheDate
colunas.