SQL सर्वर में LRU-K मान देखना संभव है?


21

SQL सर्वर sys.dm_os_memory_cache_entriesमें, कैश में प्रविष्टि की मूल लागत के साथ-साथ कैश प्रविष्टि की वर्तमान लागत ( original_costऔर current_costक्रमशः) दोनों को देखना संभव है । DMV sys.dm_os_buffer_descriptorsमें उन पृष्ठों का रिकॉर्ड होता है जो वर्तमान में मेमोरी के साथ-साथ पृष्ठों के बारे में कुछ मेटाडेटा में हैं। DVM में उपलब्ध जानकारी का एक दिलचस्प हिस्सा डेटा पृष्ठों के लिए LRU-K मान हैं।

SQL सर्वर में बफर पूल में डेटा पृष्ठों के लिए LRU-K मान प्राप्त करना संभव है? यदि हां, तो कैसे?


क्या यह संस्करण-विशिष्ट है?
JNK

1
@ जेएनके - एक आदर्श दुनिया में, नहीं, लेकिन जब तक यह एसक्यूएल सर्वर 2012 पर काम करता है, मैं वास्तव में चिंता नहीं करता हूं।
यिर्मयाह पेशाका

जवाबों:


21

वास्तव में ऐसा करने का कोई उपयोगी तरीका नहीं है जहां तक ​​मैं देख सकता हूं।

अन्य उत्तर में उल्लेख है 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किसी भी तरह का उपयोग किए बिना पृष्ठों के लिए बफर पते प्राप्त करने के लिए किसी भी तरह से अवगत नहीं हूं और इन दोनों परिवर्तनों का उपयोग करके हम जिस मूल्य का निरीक्षण करने की कोशिश कर रहे हैं!


3
खैर, यह आपके क्रिसमस को बिताने का एक तरीका है। :-)
RBarryYoung

3
@RBryryYoung तुच्छ पीछा खेल रहा है!
मार्टिन स्मिथ

यदि मैं डिबगर के उपयुक्त उपयोग के लिए बोनस अंक दे सकता हूं, तो मैं करूंगा।
यिर्मयाह पेशा

1
बहुत बढ़िया! (और महान डिबगिंग कौशल!)
DBArgenis

@DBArgenis - धन्यवाद! शर्म की बात है कि हालांकि एक व्यावहारिक समाधान नहीं लगता है। यह काफी जानकारीपूर्ण हो सकता है अगर हम इसे आसानी से देख सकें।
मार्टिन स्मिथ

8

जैसा कि मैंने ट्विटर पर श्री पेसका का उल्लेख किया है, यह जानकारी BUF संरचना पर रखी गई है जो पृष्ठ को स्मृति में रखती है। DBCC PAGE आपको यह जानकारी अपने हेडर के हिस्से के रूप में देता है।


3
Begrudgingly, मैं आपको "उत्तर", @DBArgenis प्रदान करता हूं। मैं अभी भी DBCC PAGEकुछ भी खोजने के लिए एक भयानक तरीका है, लेकिन आप सही होने लगते हैं। यह एक अफ़सोस की बात है कि डेटा DBCC PAGE, प्रभावी रूप से, अस्पष्ट है और किसी भी वास्तविक सिस्टम समय से संबंधित नहीं है।
यिर्मयाह पेशका

8
एक उदाहरण इस उत्तर के लिए एक उपयोगी जोड़ होगा।
मार्क स्टोरी-स्मिथ

3
@ MarkStorey- स्मिथ - मैं सहमत हूं। जब तक DBArgenis अपनी आस्तीन ऊपर कुछ चाल है मैं नहीं देख सकता कि यह कैसे उपयोगी है।
मार्टिन स्मिथ

2
DBCC पृष्ठ का कोई संदर्भ कभी भी उपयोगी कुछ भी नहीं है।
यिर्मयाह पेशका
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.