खोजें कि कौन सा सत्र किस अस्थायी तालिका को धारण कर रहा है


14

हमारे पास SQL ​​Server 2005 डेटाबेस है अस्थायी डेटाबेस पूर्ण हो गया है। SQL सर्वर प्रबंधन स्टूडियो में जाने से मैं अस्थायी अस्थायी सभी सारणी देख सकता हूँ। क्या यह बताना संभव है कि कौन सा सत्र किस अस्थायी तालिका में है? आदर्श रूप से एक क्वेरी जो प्रत्येक सत्र द्वारा उपयोग किए जाने वाले अस्थायी तालिकाओं को सूचीबद्ध करेगी।

धन्यवाद,


1
हम उन विशिष्ट उपयोगकर्ता को ट्रैक करना चाहते हैं जो अस्थायी डेटाबेस में स्थान का उपयोग कर रहे हैं। यह मौजूदा कार्यों की खपत है, जिसमें हम दिलचस्पी रखते हैं।
SQLMIKE

जवाबों:


16

मैंने 2007 में कनेक्ट पर कुछ वापस बनाने के लिए कहा। 2008 की रिलीज़ के लिए इसे अस्वीकार कर दिया गया, और बाद में नजरअंदाज कर दिया गया, जब तक कि कुछ साल पहले कनेक्ट की मृत्यु नहीं हुई। मैंने इसे SQL सर्वर के लिए नई प्रतिक्रिया साइट पर खोजने की कोशिश की , लेकिन यह खोज एक पूर्ण डंपस्टर आग है। मेरे अनुरोध का शीर्षक "सत्र तालिका के लिए अस्थायी सारणी" dmv था - क्योंकि खोज केवल OR कर सकती है, "मानचित्र सारणी तालिका" परिणाम के 118 पृष्ठ लौटाती है। लगता है कि Google ने आइटम को कनेक्ट नहीं होने पर कटौती करने का सुझाव दिया है

इस बीच, SQL Server 2005 और 2008 के लिए, आपको डिफ़ॉल्ट ट्रेस से यह जानकारी खींचने में सक्षम होना चाहिए:

DECLARE @FileName VARCHAR(MAX)  

SELECT @FileName = SUBSTRING(path, 0,
   LEN(path)-CHARINDEX('\', REVERSE(path))+1) + '\Log.trc'  
FROM sys.traces   
WHERE is_default = 1;  

SELECT   
     o.name,   
     o.OBJECT_ID,  
     o.create_date, 
     gt.NTUserName,  
     gt.HostName,  
     gt.SPID,  
     gt.DatabaseName,  
     gt.TEXTData 
FROM sys.fn_trace_gettable( @FileName, DEFAULT ) AS gt  
JOIN tempdb.sys.objects AS o   
     ON gt.ObjectID = o.OBJECT_ID  
WHERE gt.DatabaseID = 2 
  AND gt.EventClass = 46 -- (Object:Created Event from sys.trace_events)  
  AND o.create_date >= DATEADD(ms, -100, gt.StartTime)   
  AND o.create_date <= DATEADD(ms, 100, gt.StartTime)

बेशर्मी से इस जोनाथन Kehayias ब्लॉग पोस्ट से उठा लिया

अंतरिक्ष उपयोग का निर्धारण करने के लिए आप इसे आगे बढ़ा सकते हैं sys.db_db_partition_statsजैसे कि विचारों से डेटा में शामिल होने के लिए - जैसे:

DECLARE @FileName VARCHAR(MAX)  

SELECT @FileName = SUBSTRING(path, 0,
   LEN(path)-CHARINDEX('\', REVERSE(path))+1) + '\Log.trc'  
FROM sys.traces   
WHERE is_default = 1;  

SELECT   
     o.name,   
     o.OBJECT_ID,  
     o.create_date, 
     gt.NTUserName,  
     gt.HostName,  
     gt.SPID,  
     gt.DatabaseName,  
     gt.TEXTData,
     row_count = x.rc,
     used_page_count = x.upc
FROM sys.fn_trace_gettable( @FileName, DEFAULT ) AS gt  
JOIN tempdb.sys.objects AS o   
     ON gt.ObjectID = o.OBJECT_ID
INNER JOIN
(
 SELECT [object_id], SUM(row_count), SUM(used_page_count)
   FROM tempdb.sys.dm_db_partition_stats
   WHERE index_id IN (0,1)
   GROUP BY [object_id]
) AS x(id, rc, upc)
ON x.id = o.[object_id]
WHERE gt.DatabaseID = 2 
  AND gt.EventClass = 46 -- (Object:Created Event from sys.trace_events)  
  AND o.create_date >= DATEADD(ms, -100, gt.StartTime)   
  AND o.create_date <= DATEADD(ms, 100, gt.StartTime)

यहाँ समस्या क्वेरी पाठ द्वारा तालिका नाम को सहसंबंधित करने की कोशिश की जा रही है; यह सिर्फ व्यावहारिक नहीं है, अधिकांश समय से, उपयोगकर्ता अभी भी उस तालिका के खिलाफ एक क्वेरी को निष्पादित नहीं कर रहा है (कभी भी इसे चलाने वाले / इसे आबाद करने वाले व्यक्ति को चलाने का मन नहीं है)।

हालाँकि, और यह अन्य पाठकों के लिए है (या आपके लिए जब आप अपग्रेड करते हैं), 2012 में डिफ़ॉल्ट ट्रेस + अब अस्थायी टेबल ऑब्जेक्ट निर्माण को ट्रैक नहीं करता है , अगर #temp टेबल एक ढेर है। यकीन नहीं होता है कि यह एक संयोग है या सीधे इस तथ्य से संबंधित है कि 2012 में शुरू होने वाले सभी अस्थायी तालिकाओं में अब नकारात्मक हैobject_id । आप निश्चित रूप से इस जानकारी को इकट्ठा करने और ट्रैक करने में आपकी मदद करने के लिए विस्तारित ईवेंट में जा सकते हैं, लेकिन संभवतः यह बहुत मैनुअल काम है (और मैंने केवल यह सत्यापित किया है कि यह अब ट्रेस में ट्रैक नहीं किया गया है - आप इसे लेने में सक्षम नहीं हो सकते हैं विस्तारित घटनाओं में या तो)। डिफ़ॉल्ट ट्रेस होगा पीके या अन्य बाधा के साथ बनाई गई #temp तालिकाओं को, या निर्माण की घटना के बाद जोड़े गए अवरोधों या अनुक्रमों के साथ उठाएं, लेकिन फिर आपको ऊपर दिए गए समय-आधारित प्रतिबंधों को ढीला करना होगा (एक सूचकांक को 100ms के बाद बहुत बाद में बनाया जा सकता है) सृष्टि)।

इस साइट पर कुछ अन्य उत्तर जो उपयोगी हो सकते हैं:

मैंने SQL Server 2012 और इससे ऊपर की जानकारी को ट्रैक करने के लिए एक कस्टम एक्सटेंडेड इवेंट सेशन के साथ इस बारे में भी ब्लॉग किया है:

और पॉल व्हाइट ने सीधे पेज पढ़ने के बारे में ब्लॉग किया है (दिल की बेहोशी के लिए बिल्कुल नहीं, और न ही किसी भी तरह से स्वचालित करना आसान है):


5

यहां एक क्वेरी है जिसे आपको उस जानकारी को खोजने पर शुरू करना चाहिए जिसे आप खोज रहे हैं:

select top 10
    tsu.session_id,
    tsu.request_id,
    r.command,
    s.login_name,
    s.host_name,
    s.program_name,
    total_objects_alloc_page_count = 
        tsu.user_objects_alloc_page_count + tsu.internal_objects_alloc_page_count,
    tsu.user_objects_alloc_page_count,
    tsu.user_objects_dealloc_page_count,
    tsu.internal_objects_alloc_page_count,
    tsu.internal_objects_dealloc_page_count,
    st.text
from sys.dm_db_task_space_usage tsu
inner join sys.dm_exec_requests r
on tsu.session_id = r.session_id
and tsu.request_id = r.request_id
inner join sys.dm_exec_sessions s
on r.session_id = s.session_id
outer apply sys.dm_exec_sql_text(r.sql_handle) st
where tsu.user_objects_alloc_page_count > 0
or tsu.internal_objects_alloc_page_count > 0
order by total_objects_alloc_page_count desc;

यह क्वेरी शीर्ष 10 कार्यों के लिए उपयोगी जानकारी खींचती है, जैसे कि आवंटित / डीललोकेट किए गए पृष्ठ, कार्यों का SQL पाठ (यदि उपलब्ध हो, आदि)।

ये DMV शानदार जानकारी से भरे होते हैं, इसलिए यदि आपको अधिक डेटा की आवश्यकता होती है तो आप जो खींच रहे हैं उसके साथ मिक्स एंड मैच कर सकते हैं। लेकिन यह वर्तमान अस्थायी खपत कार्यों के समस्या निवारण के लिए एक प्रारंभिक बिंदु होना चाहिए।


धन्यवाद जो बहुत अच्छा लग रहा है। विचित्र बात यह है कि अगर मैं टेम्पेर्ड टेबल पर 'डिस्क यूसेज इन टॉप टेबल्स' रिपोर्ट चलाता हूं जो सबसे अधिक स्थान का उपयोग कर रहा है। मेरे द्वारा क्वेरी चलाने के बाद भी तालिका वहीं है।
एसक्यूएल माइक

1
@ SQLMIKE करें यदि आप जानना चाहते हैं कि कौन सी तालिका सबसे बड़ी है, तो आप इससे प्राप्त कर सकते हैं tempdb.sys.dm_db_partition_stats। दुर्भाग्य से आप वास्तव में यह नहीं बता सकते हैं कि कौन सी कॉपी #some_table_nameकिस उपयोगकर्ता की है, और क्या आप हमेशा स्टेटमेंट टेक्स्ट को खींचने में सक्षम हो सकते हैं जो किसी भी समय उस तालिका को संदर्भित करता है - जो कि वर्तमान में चल रहे उपयोगकर्ता की क्वेरी नहीं हो सकती है। आप देख सकते हैं इस और इस
हारून बर्ट्रेंड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.