Dalam SQL Server sys.dm_os_memory_cache_entries
, dimungkinkan untuk melihat biaya asli dari entri dalam cache serta biaya saat ini dari entri cache ( original_cost
dan current_cost
masing - masing). DMV sys.dm_os_buffer_descriptors
berisi catatan halaman yang saat ini ada di memori serta beberapa metadata tentang halaman. Satu potongan informasi menarik yang tidak tersedia di DVM adalah nilai LRU-K untuk halaman data.
Apakah mungkin untuk mendapatkan nilai LRU-K untuk halaman data dalam buffer pool di SQL Server? Jika ya, bagaimana caranya?
sql-server
Jeremiah Peschka
sumber
sumber
Jawaban:
Sebenarnya tidak ada cara yang berguna untuk melakukan ini sejauh yang saya bisa lihat.
Jawaban lainnya menyebutkan
DBCC PAGE
dan menyerahkannya kepada pembaca untuk mencari tahu detailnya. Dari eksperimen saya menganggap maksud merekabUse1
.Ini gagal untuk memperhitungkan bahwa
DBCC PAGE
itu sendiri adalah penggunaan halaman dan nilainya diperbarui sebelum ditampilkan kepada kami.Skrip yang menunjukkan ini ada di bawah (butuh 12 detik untuk menjalankan).
Hasil khasnya adalah
Dengan hasil kedua adalah
Output setelah penundaan 7 detik bertambah 7 dan setelah penundaan 5 detik sebesar 5.
Jadi tampak jelas bahwa nilai-nilai LRU ini adalah detik sejak beberapa zaman. Restart layanan SQL Server tidak mengubah zaman tetapi memulai ulang mesin tidak.
Nilai bergulir setiap 65.536 detik jadi saya menganggap itu hanya menggunakan sesuatu seperti
system_up_time mod 65536
Ini tidak meninggalkan satu pertanyaan yang tidak terjawab dalam pikiran saya (ada yang mengambil?). Penggunaan SQL Server
LRU-K
denganK=2
sesuai dengan buku internal. Bukankah seharusnya adabUse2
? Jika demikian, dimanakah itu?Ada satu cara untuk mengamati
bUse1
nilai tanpa mengubahnya yang saya tahu dan ditunjukkan oleh Bob Ward di sini.Melampirkan debugger ke proses SQL Server dan menampilkan memori yang dirujuk untuk alamat memori struktur buffer (ditunjukkan di
0x00000002FE1F1440
atas).Saya melakukan ini segera setelah menjalankan skrip di atas dan melihat yang berikut.
(Dari eksperimen sebelumnya saya telah menemukan byte yang disorot adalah satu-satunya yang berubah antara berjalan jadi ini pasti yang benar).
Satu aspek yang mengejutkan adalah
SELECT CAST(0xc896 as int)
=51350
.Ini persis 3600 (satu jam) kurang dari yang dilaporkan oleh
DBCC PAGE
.Saya percaya ini adalah beberapa upaya untuk menyangkal halaman yang disimpan dalam cache dengan memanggil
DBCC PAGE
dirinya sendiri. Untuk halaman "normal" pilih penyesuaian satu jam ini tidak terjadi. Setelah berlariNilai yang ditunjukkan dalam memori seperti yang diharapkan.
The
DBCC
perintah sebenarnya memperbarui nilai yang dua kali. Sekali diDengan nilai yang lebih tinggi lagi di
Dengan yang lebih rendah.
Saya tidak mengetahui cara apa pun untuk mendapatkan alamat penyangga halaman tanpa menggunakan
DBCC BUFFER
/DBCC PAGE
cara apa pun dan menggunakan kedua perubahan ini nilai yang kami coba periksa!sumber
Seperti yang saya sebutkan kepada Mr. Peschka di twitter, informasi ini disimpan di struktur BUF yang menyimpan halaman dalam memori. DBCC PAGE memberi Anda informasi ini sebagai bagian dari tajuknya.
sumber
DBCC PAGE
adalah cara yang mengerikan untuk menemukan sesuatu, tetapi Anda tampaknya benar. Sangat disayangkan bahwa data dariDBCC PAGE
, secara efektif, omong kosong dan tidak berhubungan dengan waktu sistem nyata.