Apakah mungkin untuk melihat nilai LRU-K di SQL Server?


21

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_costdan current_costmasing - masing). DMV sys.dm_os_buffer_descriptorsberisi 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?


Apakah ini khusus versi?
JNK

1
@ JNK - Di dunia yang sempurna, tidak, tapi selama itu berfungsi pada SQL Server 2012 saya tidak terlalu khawatir.
Jeremiah Peschka

Jawaban:


21

Sebenarnya tidak ada cara yang berguna untuk melakukan ini sejauh yang saya bisa lihat.

Jawaban lainnya menyebutkan DBCC PAGEdan menyerahkannya kepada pembaca untuk mencari tahu detailnya. Dari eksperimen saya menganggap maksud mereka bUse1.

Ini gagal untuk memperhitungkan bahwa DBCC PAGEitu sendiri adalah penggunaan halaman dan nilainya diperbarui sebelum ditampilkan kepada kami.

Skrip yang menunjukkan ini ada di bawah (butuh 12 detik untuk menjalankan).

USE tempdb;

CREATE TABLE T(X INT);

INSERT INTO T VALUES(1);

DECLARE @DBCCPAGE NVARCHAR(100);

SELECT @DBCCPAGE = 'DBCC PAGE(0,' + CAST(file_id AS VARCHAR) + ',' + CAST(page_id AS VARCHAR) + ',0) WITH TABLERESULTS;'
FROM   T CROSS APPLY  sys.fn_PhysLocCracker (%%physloc%%)

DECLARE @DbccResults TABLE 
(
      ID INT IDENTITY,
      ParentObject VARCHAR(1000)NULL,
      Object VARCHAR(4000)NULL,
      Field VARCHAR(1000)NULL,
      ObjectValue VARCHAR(MAX)NULL
)    
INSERT INTO @DbccResults EXEC(@DBCCPAGE)  
WAITFOR DELAY '00:00:07'
INSERT INTO @DbccResults EXEC(@DBCCPAGE)  
WAITFOR DELAY '00:00:05'
INSERT INTO @DbccResults EXEC(@DBCCPAGE)             

SELECT *
FROM @DbccResults   
WHERE Field = 'bUse1'    
ORDER BY ID

EXEC(@DBCCPAGE) 

DROP TABLE T

Hasil khasnya adalah

+----+--------------+-------------------------+-------+-------------+
| ID | ParentObject |         Object          | Field | ObjectValue |
+----+--------------+-------------------------+-------+-------------+
|  8 | BUFFER:      | BUF @0x00000002FE1F1440 | bUse1 |       54938 |
| 49 | BUFFER:      | BUF @0x00000002FE1F1440 | bUse1 |       54945 |
| 90 | BUFFER:      | BUF @0x00000002FE1F1440 | bUse1 |       54950 |
+----+--------------+-------------------------+-------+-------------+

Dengan hasil kedua adalah

+---------+-------------------------+--------------+--------------------+
| BUFFER: | BUF @0x00000002FE1F1440 | bpage        | 0x00000002F4968000 |
| BUFFER: | BUF @0x00000002FE1F1440 | bhash        | 0x0000000000000000 |
| BUFFER: | BUF @0x00000002FE1F1440 | bpageno      | (1:120)            |
| BUFFER: | BUF @0x00000002FE1F1440 | bdbid        | 8                  |
| BUFFER: | BUF @0x00000002FE1F1440 | breferences  | 0                  |
| BUFFER: | BUF @0x00000002FE1F1440 | bcputicks    | 0                  |
| BUFFER: | BUF @0x00000002FE1F1440 | bsampleCount | 0                  |
| BUFFER: | BUF @0x00000002FE1F1440 | bUse1        | 54950              |
| BUFFER: | BUF @0x00000002FE1F1440 | bstat        | 0x9                |
| BUFFER: | BUF @0x00000002FE1F1440 | blog         | 0x1c9a             |
| BUFFER: | BUF @0x00000002FE1F1440 | bnext        | 0x0000000000000000 |
+---------+-------------------------+--------------+--------------------+

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-Kdengan K=2sesuai dengan buku internal. Bukankah seharusnya ada bUse2? Jika demikian, dimanakah itu?

Ada satu cara untuk mengamati bUse1nilai 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 0x00000002FE1F1440atas).

Saya melakukan ini segera setelah menjalankan skrip di atas dan melihat yang berikut.

masukkan deskripsi gambar di sini

(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 PAGEdirinya sendiri. Untuk halaman "normal" pilih penyesuaian satu jam ini tidak terjadi. Setelah berlari

SELECT *
FROM T

SELECT ((ms_ticks) % 65536000) / 1000 AS [Roughly Expected Value]
FROM sys.dm_os_sys_info

Nilai yang ditunjukkan dalam memori seperti yang diharapkan.

The DBCCperintah sebenarnya memperbarui nilai yang dua kali. Sekali di

sqlmin.dll!BPool::Touch()  + 0x3bfe bytes   
sqlmin.dll!BPool::Get()  + 0x12e bytes  
sqlmin.dll!LatchedBuf::ReadLatch()  + 0x14f bytes   
sqlmin.dll!UtilDbccDumpPage()  + 0x364 bytes    
sqlmin.dll!DbccPage()  + 0xfa bytes 
sqllang.dll!DbccCommand::Execute()  + 0x153 bytes

Dengan nilai yang lebih tinggi lagi di

sqlmin.dll!LatchedBuf::FreeAndUnlatch()  + 0x71 bytes   
sqlmin.dll!UtilDbccDumpPage()  + 0x545 bytes    
sqlmin.dll!DbccPage()  + 0xfa bytes 
sqllang.dll!DbccCommand::Execute()  + 0x153 bytes   

Dengan yang lebih rendah.

Saya tidak mengetahui cara apa pun untuk mendapatkan alamat penyangga halaman tanpa menggunakan DBCC BUFFER/ DBCC PAGEcara apa pun dan menggunakan kedua perubahan ini nilai yang kami coba periksa!


3
Nah, ini salah satu cara untuk menghabiskan Natal Anda. :-)
RBarryYoung

3
@RBarryYoung Beats bermain Trivial Pursuit!
Martin Smith

Jika saya bisa memberikan poin bonus untuk penggunaan debugger yang tepat, saya akan melakukannya.
Jeremiah Peschka

1
Sudah selesai dilakukan dengan baik! (Dan keterampilan debugging yang hebat!)
DBArgenis

@DBArgenis - Terima kasih! Sayang sekali tampaknya tidak ada solusi praktis. Mungkin cukup informatif jika kita bisa melihatnya dengan mudah.
Martin Smith

8

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.


3
Dengan ragu, saya memberi Anda "jawabannya", @DBArgenis. Saya masih mempertahankan bahwa itu DBCC PAGEadalah 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.
Jeremiah Peschka

8
Contoh akan menjadi tambahan yang berguna untuk jawaban ini.
Mark Storey-Smith

3
@ MarkStorey-Smith - Saya setuju. Kecuali DBArgenis memiliki beberapa trik di lengan bajunya saya tidak bisa melihat bagaimana ini berguna.
Martin Smith

2
Tidak ada referensi ke PAGE DBCC yang pernah berarti sesuatu yang bermanfaat.
Jeremiah Peschka
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.