Tengo una tabla grande (decenas a cientos de millones de registros) que hemos dividido por razones de rendimiento en tablas activas y de archivo, utilizando un mapeo de campo directo y ejecutando un proceso de archivo todas las noches.
En varios lugares de nuestro código, necesitamos ejecutar consultas que combinen las tablas activas y de archivo, casi siempre filtradas por uno o más campos (que obviamente hemos puesto índices en ambas tablas). Por conveniencia, tendría sentido tener una vista como esta:
create view vMyTable_Combined as
select * from MyTable_Active
union all
select * from MyTable_Archive
Pero si ejecuto una consulta como
select * from vMyTable_Combined where IndexedField = @val
hará la unión en todo, desde Active y Store antes de filtrar @val
, lo que va a matar el rendimiento.
¿Hay alguna forma inteligente de hacer que las dos subconsultas de la unión vean cada filtro @val
antes de que creen la unión?
¿O tal vez hay algún otro enfoque que sugiera que logre lo que busco, es decir, una forma fácil y eficiente de obtener el conjunto de registros sindicales, filtrado por el campo indexado?
EDITAR: aquí está el plan de ejecución (y puedes ver los nombres reales de las tablas aquí):
Por extraño que parezca, la tabla activa está usando el índice correcto (¿más una búsqueda RID?) ¡Pero la tabla de archivo está escaneando la tabla!