2009-03-07 10 views
76

मेरा एप्लिकेशन, जो ओरेकल डेटाबेस का उपयोग करता है, धीमा हो रहा है या ऐसा लगता है कि पूरी तरह से बंद हो गया है।लंबे समय तक चलने वाले प्रश्नों के लिए ऑरैकल डेटाबेस कैसे जांचें?

यह पता कैसे लगा सकता है कि कौन से प्रश्न सबसे महंगे हैं, इसलिए मैं आगे की जांच कर सकता हूं?

+10

मैं वास्तव में यह नहीं समझता कि यह "असली सवाल नहीं है" –

+5

यह सबसे उपयोगी नकली प्रश्न है जिसे मैंने कभी देखा है :) – FGreg

+4

यह पोस्ट "ओरेकल धीमी गति से चलने वाले प्रश्नों" को गुगल करते समय # 1 के रूप में आता है। वर्तमान में रहने के लिए अधिक उत्तरों की अनुमति देने के लिए प्रश्न को फिर से खोलने के बारे में कैसे? – andersand

उत्तर

26

इसे आज़माएं, यह आपको वर्तमान में 60 सेकंड से अधिक समय तक चलने वाले प्रश्न देगा। ध्यान दें कि एसक्यूएल में कई लाइनें हैं, तो यह प्रति चलती क्वेरी के एकाधिक लाइनों को प्रिंट करती है। एक साथ क्या संबंध है देखने के लिए, धारावाहिक # देखें।

select s.username,s.sid,s.serial#,s.last_call_et/60 mins_running,q.sql_text from v$session s 
join v$sqltext_with_newlines q 
on s.sql_address = q.address 
where status='ACTIVE' 
and type <>'BACKGROUND' 
and last_call_et> 60 
order by sid,serial#,q.piece 
+0

मैं इस क्वेरी को चलाता हूं और यह बताता है कि मुझे अमान्य कथन –

+0

यह मान्य है। मैंने इसका परीक्षण किया। क्वेरी के लिए आप किस उपकरण का उपयोग कर रहे हैं? यह # संकेत के साथ भ्रमित हो रहा है। इस तरह की शुरुआत और अंत को बदलने का प्रयास करें: "से चुनें * ... sid द्वारा qus, q.piece" –

+2

इसके अलावा, आपको इसे एक निजीकृत खाते से चलाने की आवश्यकता होगी जिसके पास v $ सत्र, v $ sqltext_with_newlines तक पहुंच है –

5

वी $ session_longops आप sofar ढूंढें! = Totalwork आप जो कि पूरा नहीं किया है देखेंगे लेकिन हटाई गई प्रविष्टियां नहीं कर रहे हैं जब आपरेशन पूरा करता है तो आप भी वहाँ इतिहास का एक बहुत देख सकते हैं ।

select S.USERNAME, s.sid, s.osuser, t.sql_id, sql_text 
from v$sqltext_with_newlines t,V$SESSION s 
where t.address =s.sql_address 
and t.hash_value = s.sql_hash_value 
and s.status = 'ACTIVE' 
and s.username <> 'SYSTEM' 
order by s.sid,t.piece 
/

इस ताले चलता -:

+0

अच्छा संकेत। विवरण [यहां] (http://stackoverflow.com/questions/199508) में भी चर्चा की। –

105

यह एक एसक्यूएल वह यह है कि वर्तमान में "सक्रिय" को दर्शाता है। कभी-कभी चीजें धीमी गति से जा रहे हैं, लेकिन क्योंकि यह एक ताला के लिए इंतजार को अवरोधित कर रहा है यह है:

select 
    object_name, 
    object_type, 
    session_id, 
    type,   -- Type or system/user lock 
    lmode,  -- lock mode in which session holds lock 
    request, 
    block, 
    ctime   -- Time since current mode was granted 
from 
    v$locked_object, all_objects, v$lock 
where 
    v$locked_object.object_id = all_objects.object_id AND 
    v$lock.id1 = all_objects.object_id AND 
    v$lock.sid = v$locked_object.session_id 
order by 
    session_id, ctime desc, object_name 
/

यह लंबे ऑपरेशन (उदा पूर्ण तालिका स्कैन) की खोज के लिए एक अच्छा एक है। यदि यह बहुत कम परिचालनों के कारण है, तो कुछ भी दिखाई नहीं देगा।

COLUMN percent FORMAT 999.99 

SELECT sid, to_char(start_time,'hh24:mi:ss') stime, 
message,(sofar/totalwork)* 100 percent 
FROM v$session_longops 
WHERE sofar/totalwork < 1 
/
+0

तीसरी क्वेरी 'सीरियल #' का चयन करके मेरे लिए भी काम करती है। –

+0

यदि वे x मिनट से अधिक समय तक चलते हैं तो ऐसे प्रश्नों को सुरक्षित रूप से मारने का कोई तरीका है। उत्तर के लिए धन्यवाद हालांकि @UmberFerrule – TommyT

+0

@TommyT आप यहां वर्णित सिस्टम परिवर्तन सत्र 'का उपयोग कर सकते हैं: https://docs.oracle.com/cd/B28359_01/server.111/b28310/manproc008.htm#ADMIN11192 –

4
Step 1:Execute the query 

column username format 'a10' 
column osuser format 'a10' 
column module format 'a16' 
column program_name format 'a20' 
column program format 'a20' 
column machine format 'a20' 
column action format 'a20' 
column sid format '9999' 
column serial# format '99999' 
column spid format '99999' 
set linesize 200 
set pagesize 30 
select 
a.sid,a.serial#,a.username,a.osuser,c.start_time, 
b.spid,a.status,a.machine, 
a.action,a.module,a.program 
from 
v$session a, v$process b, v$transaction c, 
v$sqlarea s 
Where 
a.paddr = b.addr 
and a.saddr = c.ses_addr 
and a.sql_address = s.address (+) 
and to_date(c.start_time,'mm/dd/yy hh24:mi:ss') <= sysdate - (15/1440) -- running for 15 minutes 
order by c.start_time 
/ 

Step 2: desc v$session 

Step 3:select sid, serial#,SQL_ADDRESS, status,PREV_SQL_ADDR from v$session where sid='xxxx' //(enter the sid value) 

Step 4: select sql_text from v$sqltext where address='XXXXXXXX'; 

Step 5: select piece, sql_text from v$sqltext where address='XXXXXX' order by piece; 
0

आप AWR (ऑटोमेटिक वर्कलोड रिपोज़िटरी) डीबी से रिपोर्ट तैयार कर सकते हैं। एसक्यूएल से भागो * प्लस आदेश पंक्ति:

एसक्यूएल> @ $ ORACLE_HOME/RDBMS/व्यवस्थापक/awrrpt.sql

पढ़ें कैसे उत्पन्न करने के लिए & AWR रिपोर्ट को समझने के लिए संबंधित दस्तावेज़। यह डीबी प्रदर्शन & संसाधन समस्या का पूरा दृश्य देगा। एक बार जब हम एडब्लूआर रिपोर्ट से परिचित होते हैं तो संसाधन का उपभोग करने वाले शीर्ष एसक्यूएल को ढूंढना उपयोगी होगा।

12 सी ईएम एक्सप्रेस यूआई में भी हम एडब्लूआर उत्पन्न कर सकते हैं।

संबंधित मुद्दे