อันที่จริงไม่มีวิธีที่มีประโยชน์ในการทำเท่าที่ฉันเห็น
คำตอบอื่น ๆ กล่าวถึงDBCC PAGEและปล่อยให้ผู้อ่านหารายละเอียด bUse1จากการทดลองผมถือว่าพวกเขาหมายถึง
การดำเนินการนี้ล้มเหลวในการใช้บัญชีที่DBCC PAGEใช้งานหน้าเว็บและค่าจะได้รับการอัปเดตก่อนที่จะปรากฏแก่เรา
สคริปต์แสดงสิ่งนี้อยู่ด้านล่าง (ใช้เวลา 12 วินาทีในการเรียกใช้)
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
ผลลัพธ์โดยทั่วไปคือ
+----+--------------+-------------------------+-------+-------------+
| ID | ParentObject | Object | Field | ObjectValue |
+----+--------------+-------------------------+-------+-------------+
| 8 | BUFFER: | BUF @0x00000002FE1F1440 | bUse1 | 54938 |
| 49 | BUFFER: | BUF @0x00000002FE1F1440 | bUse1 | 54945 |
| 90 | BUFFER: | BUF @0x00000002FE1F1440 | bUse1 | 54950 |
+----+--------------+-------------------------+-------+-------------+
ด้วยผลที่สองถูก
+---------+-------------------------+--------------+--------------------+
| 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 |
+---------+-------------------------+--------------+--------------------+
ผลลัพธ์หลังจากการหน่วงเวลา 7 วินาทีเพิ่มขึ้น 7 และหลังการหน่วงเวลา 5 วินาที 5
ดังนั้นจึงเห็นได้ชัดว่าค่า LRU เหล่านี้เป็นวินาทีตั้งแต่ยุค การเริ่มบริการ SQL Server ใหม่จะไม่เปลี่ยนช่วงเวลา แต่การรีสตาร์ทเครื่องจะไม่
ค่ามีการหมุนวนในทุก ๆ 65,536 วินาทีดังนั้นฉันจึงสันนิษฐานว่ามันใช้สิ่งที่ชอบ system_up_time mod 65536
สิ่งนี้ทำให้คำถามหนึ่งคำถามที่ยังไม่ได้คำตอบในใจของฉัน (ผู้ใด?) SQL Server ใช้LRU-KกับK=2ตามหนังสือ internals ไม่ควรจะมีbUse2? ถ้าอย่างนั้นอยู่ที่ไหน
มีวิธีหนึ่งในการสังเกตbUse1ค่าโดยไม่ต้องเปลี่ยนค่าที่ฉันรู้และนั่นแสดงให้เห็นโดย Bob Wardที่นี่
แนบดีบักเกอร์กับกระบวนการ SQL Server และแสดงหน่วยความจำอ้างอิงสำหรับที่อยู่หน่วยความจำของโครงสร้างบัฟเฟอร์ (แสดงเป็น0x00000002FE1F1440ด้านบน)
ฉันทำสิ่งนี้ทันทีหลังจากเรียกใช้สคริปต์ด้านบนและเห็นสิ่งต่อไปนี้

(จากการทดลองก่อนหน้านี้ฉันพบว่าไบต์ที่ถูกเน้นเป็นสิ่งเดียวที่เปลี่ยนไประหว่างการวิ่งดังนั้นสิ่งเหล่านี้จึงเป็นสิ่งที่ถูกต้องอย่างแน่นอน)
แง่มุมหนึ่งที่น่าแปลกใจคือ=SELECT CAST(0xc896 as int)51350
ตรงนี้เป็น 3600 (หนึ่งชั่วโมง) DBCC PAGEน้อยกว่าที่รายงานโดย
ฉันเชื่อว่านี่เป็นความพยายามที่จะลบหน้าเว็บที่ถูกเก็บไว้ในแคชด้วยการเรียกDBCC PAGEตัวเอง สำหรับหน้า "ปกติ" ให้เลือกการปรับหนึ่งชั่วโมงนี้จะไม่เกิดขึ้น หลังจากวิ่ง
SELECT *
FROM T
SELECT ((ms_ticks) % 65536000) / 1000 AS [Roughly Expected Value]
FROM sys.dm_os_sys_info
ค่าที่แสดงในหน่วยความจำเป็นไปตามที่คาดไว้
DBCCคำสั่งจริง ๆ การปรับปรุงค่าที่สองครั้ง ครั้งหนึ่งที่
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
ด้วยมูลค่าที่สูงกว่านั้นอีกครั้งที่
sqlmin.dll!LatchedBuf::FreeAndUnlatch() + 0x71 bytes
sqlmin.dll!UtilDbccDumpPage() + 0x545 bytes
sqlmin.dll!DbccPage() + 0xfa bytes
sqllang.dll!DbccCommand::Execute() + 0x153 bytes
ด้วยตัวที่ต่ำกว่า
ฉันไม่ทราบวิธีที่จะได้รับที่อยู่บัฟเฟอร์สำหรับหน้าเว็บโดยไม่ต้องใช้DBCC BUFFER/ DBCC PAGEวิธีใด ๆ และใช้ทั้งการเปลี่ยนแปลงเหล่านี้มูลค่าที่เราพยายามตรวจสอบ!