Saya menghadapi masalah aneh yang terjadi ketika mengakses catatan sejarah dalam tabel temporal. Kueri yang mengakses entri yang lebih lama di tabel temporal melalui AS OF sub-klausa membutuhkan waktu lebih lama daripada kueri pada entri historis terbaru.
Tabel historis dihasilkan oleh SQL Server (termasuk indeks berkerumun pada kolom tanggal dan menggunakan kompresi halaman), saya telah menambahkan 50 juta baris ke tabel historis, dan pertanyaan saya mengambil sekitar 25.000 baris.
Saya telah mencoba menentukan akar penyebab masalah tetapi belum dapat mengidentifikasinya. Sejauh ini saya sudah menguji:
- Membuat tabel uji dengan 50 juta baris dengan indeks berkerumun untuk melihat apakah perlambatan hanya karena volume. Saya dapat mengambil 25K baris pada waktu yang konstan (~ 400 ms).
- Menghapus kompresi halaman dari tabel historis. Itu tidak berpengaruh pada waktu pengambilan tetapi tidak secara signifikan meningkatkan ukuran tabel.
- Saya mencoba mengakses baris tabel sejarah secara langsung menggunakan kolom ID vs kolom tanggal. Di sinilah hal-hal sedikit lebih menarik. Saya bisa mengakses baris yang lebih tua di tabel di ~ 400ms di mana seperti dengan AS OF sub klausa akan butuh ~ 1200ms. Saya mencoba memfilter pada tabel pengujian saya pada kolom tanggal dan melihat perlambatan serupa jika dibandingkan dengan pemfilteran pada kolom ID. Ini membuat saya percaya bahwa perbandingan tanggal ada di belakang beberapa perlambatan.
Saya ingin melihat ini lebih banyak tetapi saya juga ingin memastikan bahwa saya tidak menggonggong pohon yang salah. Pertama, apakah ada orang lain yang mengalami perilaku yang sama ketika mengakses data historis yang lebih lama di tabel temporal (kami hanya melihat perlambatan melewati 10 juta baris)? Kedua, apa sajakah strategi yang dapat saya gunakan untuk lebih mengisolasi akar penyebab masalah kinerja (saya baru saja mulai melihat ke rencana eksekusi tetapi masih agak samar bagi saya)?
Rencana eksekusi
Ini adalah permintaan pengambilan sederhana: yang pertama mengakses baris yang lebih tua, yang kedua mengakses baris yang lebih baru.
Baris Lama ~ waktu eksekusi 1200 ms
Baris terbaru ~ 350 ms waktu eksekusi
Detail tabel
Ini adalah kolom dalam tabel temporal. Tabel sejarah memiliki kolom yang sama tetapi tidak memiliki kunci utama (sesuai persyaratan tabel riwayat):
sumber