Saya memiliki tabel besar (puluhan hingga ratusan juta rekaman) yang kami bagi karena alasan kinerja menjadi tabel aktif dan arsip, menggunakan pemetaan lapangan langsung, dan menjalankan proses arsip setiap malam.
Di beberapa tempat dalam kode kami, kami perlu menjalankan kueri yang menggabungkan tabel aktif dan arsip, hampir selalu difilter oleh satu atau beberapa bidang (yang kami jelaskan menempatkan indeks di kedua tabel). Untuk kenyamanan, masuk akal untuk memiliki tampilan seperti ini:
create view vMyTable_Combined as
select * from MyTable_Active
union all
select * from MyTable_Archive
Tetapi jika saya menjalankan query seperti
select * from vMyTable_Combined where IndexedField = @val
itu akan melakukan penyatuan pada segala sesuatu dari Active dan Store sebelum difilter @val
, yang akan mematikan kinerja.
Apakah ada cara cerdas untuk membuat dua sub-kueri dari gabungan melihat setiap filter @val
sebelum mereka membuat gabungan?
Atau mungkin ada beberapa pendekatan lain yang Anda sarankan untuk mencapai apa yang saya tuju, yaitu cara yang mudah dan efisien untuk mendapatkan catatan serikat pekerja, difilter oleh bidang yang diindeks?
EDIT: inilah rencana eksekusi (dan Anda bisa melihat nama tabel sebenarnya di sini):
Anehnya, tabel aktif sebenarnya menggunakan indeks yang benar (plus pencarian RID?) Tetapi tabel arsip melakukan pemindaian tabel!