私はパフォーマンスの理由でアクティブテーブルとアーカイブテーブルに分割し、直接フィールドマッピングを使用して、アーカイブプロセスを毎晩実行する大きなテーブル(数千から数億レコード)を持っています。
コード内のいくつかの場所で、アクティブテーブルとアーカイブテーブルを結合するクエリを実行する必要があります。ほぼ常に1つ以上のフィールド(両方のテーブルにインデックスを配置している)によってフィルター処理されます。便宜上、次のようなビューがあると理にかなっています。
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
を作成する前に、ユニオンビューの2つのサブクエリを各フィルターで作成する賢い方法はありますか?
それとも、私が目指していることを達成するために提案する他のアプローチがあるかもしれません。つまり、インデックス付きフィールドによってフィルター処理されたユニオンレコードセットを取得する簡単で効率的な方法ですか。
編集:ここに実行計画があります(そして実際のテーブル名がここに表示されます):
奇妙なことに、アクティブテーブルは実際には正しいインデックス(およびRID検索?)を使用していますが、アーカイブテーブルはテーブルスキャンを実行しています!