У меня есть большая таблица (от десятков до сотен миллионов записей), которую мы разбили по соображениям производительности на активные и архивные таблицы, используя прямое сопоставление полей и выполняя процесс архивирования каждую ночь.
В некоторых местах нашего кода нам нужно запускать запросы, которые объединяют активные и архивные таблицы, почти неизменно фильтруемые одним или несколькими полями (которые мы явно поместили в обе таблицы). Для удобства было бы целесообразно иметь такой вид:
create view vMyTable_Combined as
select * from MyTable_Active
union all
select * from MyTable_Archive
Но если я запускаю запрос, как
select * from vMyTable_Combined where IndexedField = @val
он объединит все, от Active и Store до фильтрации @val
, что снизит производительность.
Есть ли какой-нибудь умный способ заставить два подзапроса объединения просматривать каждый фильтр @val
до того, как они создадут объединение?
Или, может быть, есть какой-то другой подход, который вы бы предложили, чтобы достичь того, чего я добиваюсь, то есть простой и эффективный способ получения набора записей объединения, отфильтрованного по индексированному полю?
РЕДАКТИРОВАТЬ: вот план выполнения (и вы увидите реальные имена таблиц здесь):
Как ни странно, активная таблица на самом деле использует правильный индекс (плюс поиск RID?), Но архивная таблица выполняет сканирование таблицы!