वास्तव में ऐसा करने का कोई उपयोगी तरीका नहीं है जहां तक मैं देख सकता हूं।
अन्य उत्तर में उल्लेख है 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 सर्वर सेवा को पुनरारंभ करने से युग परिवर्तन नहीं होता है, लेकिन मशीन को पुनरारंभ करना पड़ता है।
मूल्य हर 65,536 सेकंड से अधिक रोल करता है, इसलिए मुझे लगता है कि यह सिर्फ कुछ का उपयोग करता है system_up_time mod 65536
यह मेरे मन में कोई भी अनुत्तरित प्रश्न छोड़ता है (कोई लेने वाला?)। एसक्यूएल सर्वर का उपयोग करता है LRU-K
के साथ K=2
आंतरिक पुस्तक के अनुसार। वहाँ एक नहीं होना चाहिए bUse2
? यदि हां, तो वह कहां है?
bUse1
मूल्य को देखने के बिना इसे बदलने का एक तरीका है कि मुझे हालांकि पता है और यह बॉब वार्ड द्वारा यहां प्रदर्शित किया गया है।
SQL सर्वर प्रक्रिया के लिए डिबगर संलग्न करें और बफर संरचना के मेमोरी पते के लिए संदर्भित मेमोरी प्रदर्शित करें ( 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
किसी भी तरह का उपयोग किए बिना पृष्ठों के लिए बफर पते प्राप्त करने के लिए किसी भी तरह से अवगत नहीं हूं और इन दोनों परिवर्तनों का उपयोग करके हम जिस मूल्य का निरीक्षण करने की कोशिश कर रहे हैं!