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 mereka bUse1
.
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).
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-K
dengan K=2
sesuai dengan buku internal. Bukankah seharusnya ada bUse2
? 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 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 DBCC
perintah 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 PAGE
cara apa pun dan menggunakan kedua perubahan ini nilai yang kami coba periksa!