2012-04-27 19 views
5

मेरे पास ओरेकल में एक क्वेरी चल रही है, जो लटका या हो सकता है। यह अब ~ 10 घंटों के लिए चल रहा है, लेकिन जो डेटा लोड हो रहा है उस पर आधारित है जो अनुचित नहीं हो सकता है।यह बताएं कि कोई क्वेरी लटक रही है या नहीं,

मैं जीवी $ सत्र में सत्र देख रहा था और सोच रहा था कि क्या उस जानकारी का अनुवाद करने का कोई तरीका है यह देखने के लिए कि वास्तव में कोई गतिविधि चल रही है या यदि क्वेरी लॉक के लिए प्रतीक्षा कर रही है या अन्यथा लटका है।

मैंने इस दृश्य के लिए पहले ही प्रलेखन पढ़ा है here। मैं ज्यादातर उन लोगों की युक्तियों की तलाश में हूं जिनके अनुभव ओरेकल में इन प्रकार के मुद्दों को डीबग करने का अनुभव था।

धन्यवाद!

+1

वहाँ 'वी $ session_longops' में एक प्रविष्टि है कि आप अगर यह प्रगति को देखने के लिए जांच कर सकता है की जाँच करें करने के लिए सहायक हो जाएगा? वैकल्पिक रूप से यह देखने के तरीकों के लिए इस लिंक को जांचें कि आपका सत्र अवरुद्ध हो रहा है या नहीं: http://www.orafaq.com/node/854 – Ollie

+0

धन्यवाद, मैं यह देखने के लिए जीवी $ स्क्लेरिया के साथ इसे जोड़ सकता हूं कि कौन से कथन मुझे पकड़ रहे हैं! – Paul

उत्तर

7

gv$session में, event कॉलम से आपको क्या घटना अपने सत्र वर्तमान पर इंतज़ार कर रहा है इंतजार। यदि आपका सत्र किसी अन्य सत्र द्वारा आयोजित किसी प्रकार के लॉक पर इंतजार कर रहा है, तो event आपको बताएगा कि (उदाहरण के लिए, यह "enq: TX - पंक्ति लॉक विवाद" होगा यदि आप किसी अन्य सत्र द्वारा आयोजित पंक्ति को लॉक करने का इंतजार कर रहे हैं) और blocking_instance और blocking_session लॉक के धारक के उदाहरण और सत्र आईडी के साथ पॉप्युलेट किया जाएगा। वर्तमान प्रतीक्षा ईवेंट में सत्र कितने सेकंड खर्च किए गए हैं, यह निर्धारित करने के लिए आप seconds_in_wait (यदि wait_time=0) देख सकते हैं। आपको कम से कम यह बताने चाहिए कि आपका सत्र वर्तमान में "अटक गया है" लेकिन यह आपको नहीं बताता है कि आपकी क्वेरी वास्तव में खत्म होने जा रही है - यदि कोई खराब योजना है, तो यह पूरी तरह से संभव है कि आपको "अच्छा" डिस्क I/O के लिए इंतजार जैसी घटनाओं की प्रतीक्षा करें जो इंगित करते हैं कि सत्र कुछ कर रहा है लेकिन क्वेरी वास्तव में कभी खत्म नहीं होने जा रही है।

+0

ग्रेट जानकारी। धन्यवाद! – Paul

+1

'वैकल्पिक प्रणाली हत्या सत्र' 'का चयन करें || ',' || "सीरियल #" || '' ';', जीवी $ सत्र से घटना जहां मशीन = 'आपकी मशीन' उन्हें मारने के लिए कमांड उत्पन्न करने के लिए आसान है। बस पेस्ट कॉलम 1 कॉपी करें – JDPeckham

3

कुछ आगे अनुसंधान और ओली की टिप्पणी के आधार पर मैं इन प्रश्नों कि इस मुद्दे को डिबग मदद के साथ आया था:

select s.sid, 
     s.username, 
     s.machine, 
     s.osuser, 
     cpu_time, 
     (elapsed_time/1000000)/60 as minutes, 
     sql_text 
from gv$sqlarea a, gv$session s 
where s.sql_id = a.sql_id 
and s.machine like '####'; 


select lo.*, 
     a.sql_text 
from gv$sqlarea a, gv$session_longops lo 
where lo.sql_id = a.sql_id 
and lo.sid = #### 
order by lo.start_time; 
+1

उन विचारों में सटीक कॉलम की जांच किए बिना, क्या SQL_ID के माध्यम से gv $ session_longops को gv $ sqlarea को लिंक करना बेहतर नहीं होगा? मैं इस समय अपने पीसी के सामने नहीं हूं इसलिए मैं जांच नहीं कर सकता :-( – Ollie

+2

यह भी काम करता है। मैंने जवाब अपडेट किया। – Paul

0

यह वर्तमान रनिंग सत्र

select a.SID, a.SERIAL#, c.OBJECT_NAME 
from v$session a, v$locked_object b, user_objects c 
where a.SID=b.SESSION_ID and b.OBJECT_ID=c.OBJECT_ID 
संबंधित मुद्दे