Ho una tabella di grandi dimensioni (da decine a centinaia di milioni di record) che abbiamo suddiviso per motivi di prestazioni in tabelle attive e di archiviazione, utilizzando una mappatura diretta dei campi ed eseguendo un processo di archiviazione ogni notte.
In diversi punti del nostro codice è necessario eseguire query che combinano le tabelle attive e di archiviazione, filtrate quasi invariabilmente da uno o più campi (su cui ovviamente abbiamo inserito gli indici in entrambe le tabelle). Per comodità avrebbe senso avere una vista del genere:
create view vMyTable_Combined as
select * from MyTable_Active
union all
select * from MyTable_Archive
Ma se eseguo una query come
select * from vMyTable_Combined where IndexedField = @val
farà l'unione su tutto da Active e Store prima di filtrare @val
, il che ucciderà le prestazioni.
Esiste un modo intelligente per far sì che le due sottoquery dell'unione visualizzino ogni filtro @val
prima che creino l'unione?
O forse c'è qualche altro approccio che suggeriresti che raggiunge quello che sto cercando, ovvero un modo semplice ed efficiente per ottenere il set di record del sindacato, filtrato dal campo indicizzato?
EDIT: ecco il piano di esecuzione (e qui puoi vedere i nomi delle tabelle reali):
Stranamente, la tabella attiva sta effettivamente utilizzando l'indice corretto (più una ricerca RID?) Ma la tabella di archivio sta eseguendo una scansione della tabella!