Ich habe eine große Tabelle (zehn bis hundert Millionen Datensätze), die wir aus Leistungsgründen in aktive und archivierte Tabellen aufgeteilt haben, die eine direkte Feldzuordnung verwenden und jede Nacht einen Archivierungsprozess ausführen.
An mehreren Stellen in unserem Code müssen Abfragen ausgeführt werden, die die aktiven und archivierten Tabellen kombinieren und fast immer nach einem oder mehreren Feldern gefiltert werden (auf die wir offensichtlich in beiden Tabellen Indizes gesetzt haben). Der Einfachheit halber wäre es sinnvoll, eine Ansicht wie diese zu haben:
create view vMyTable_Combined as
select * from MyTable_Active
union all
select * from MyTable_Archive
Aber wenn ich eine Abfrage wie mache
select * from vMyTable_Combined where IndexedField = @val
Es wird die Vereinigung für alles von Active und Store durchführen, bevor nach gefiltert wird @val
, was die Leistung beeinträchtigen wird.
Gibt es eine clevere Möglichkeit, die beiden Unterabfragen der Union so zu gestalten, dass sie jeden Filter anzeigen, @val
bevor sie die Union erstellen?
Oder gibt es einen anderen Ansatz, den Sie vorschlagen würden, um das zu erreichen, was ich anstrebe, dh eine einfache und effiziente Methode, um den Gewerkschaftsdatensatz nach dem indizierten Feld zu filtern?
BEARBEITEN: Hier ist der Ausführungsplan (und Sie können die tatsächlichen Tabellennamen hier sehen):
Seltsamerweise verwendet die aktive Tabelle tatsächlich den richtigen Index (plus eine RID-Suche?), Aber die Archivtabelle führt einen Tabellenscan durch!