Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

Oracle 19c Open_cursor समस्या से आगे निकल गया

मैं आपको यह नहीं बता सकता कि आपकी अधिकतम खुले कर्सर समस्या का कारण क्या है, लेकिन मैं आपको GV$OPEN_CURSOR का उपयोग करके संबंधित सत्रों और SQL कथन की पहचान करके कारण खोजने का तरीका बताता हूं। ।

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

select count(*) over (partition by inst_id, sid) cursors_per_session, gv$open_cursor.*
from gv$open_cursor
order by cursors_per_session desc, inst_id, sid;

ध्यान रखें कि उस दृश्य में कई अजीबोगरीब प्रश्न होंगे जो आपके अनुमान से अधिक संख्या में हो सकते हैं। सभी पुनरावर्ती और कैश्ड प्रश्नों के साथ, "उबाऊ" सत्र में 50 कर्सर का उपयोग करना असामान्य नहीं है। आप सैकड़ों खुले कर्सर वाले सत्रों की तलाश कर रहे हैं। (जब तक कि कोई मूर्खतापूर्वक पैरामीटर मान को डिफ़ॉल्ट से कम न कर दे।)

दुर्भाग्य से, GV$OPEN_CURSOR ऐतिहासिक डेटा शामिल नहीं है, और यदि तंग लूप के अंदर कोई अपवाद है जो बहुत सारे कर्सर को जल्दी से खोलता है, तो ये समस्याएं जल्दी से शुरू और बंद हो सकती हैं। नीचे पीएल/एसक्यूएल ब्लॉक तब तक चलता है जब तक कि उसे बड़ी संख्या में खुले कर्सर के साथ एक सत्र नहीं मिल जाता, डेटा संग्रहीत करता है, और बाहर निकलता है। यह पीएल/एसक्यूएल ब्लॉक महंगा है, और सही समय की प्रतीक्षा में प्रसंस्करण के पूरे सत्र का उपयोग करेगा, इसलिए समस्या को खोजने के लिए केवल एक बार इसका उपयोग करें।

--Create table to hold the results.
create table too_many_cursors as
select 1 cursors_per_session, gv$open_cursor.*
from gv$open_cursor
where 1 = 0;


--Write the open cursor data when a session gets more than N open cursors.
declare
    v_open_cursor_threshold number := 50;
    v_count number;
begin
    --Loop forever until the problem is found.
    loop
        --Count the largest numbe of open cursors.
        select max(the_count)
        into v_count
        from
        (
            select count(*) the_count
            from gv$open_cursor
            group by inst_id, sid
        );

        --If the threshold is reached, write the data, commit it, and quit the program.
        if v_count >= v_open_cursor_threshold then

            insert into too_many_cursors
            select *
            from
            (
                select count(*) over (partition by inst_id, sid) cursors_per_session, gv$open_cursor.*
                from gv$open_cursor
            )
            where cursors_per_session >= v_open_cursor_threshold;
            
            commit;
            
            exit;
        end if;
        
    end loop;
end;
/


--Your problem should now be in this table:
select * from too_many_cursors;

यदि आप निगरानी का परीक्षण करना चाहते हैं, तो आप बड़ी संख्या में कर्सर खोलने के लिए नीचे दिए गए PL/SQL ब्लॉक का उपयोग कर सकते हैं।

--Open a large number of cursors in and wait for 20 seconds.
--(Done by creating a dynamic PL/SQL block with many "open" commands with a "sleep" at the end.
declare
    v_number_of_open_cursors number := 200;
    v_declarations clob;
    v_opens clob;
    v_sql clob;
begin
    for i in 1 .. v_number_of_open_cursors loop
        v_declarations := v_declarations || 'v_cursor'|| i ||' sys_refcursor;' || chr(10);
        v_opens := v_opens || 'open v_cursor' || i || ' for select * from dual;';
    end loop;

    v_sql :=
        'declare '||chr(10)||v_declarations||chr(10)||
        'begin'||chr(10)||v_opens||chr(10)||
        'dbms_lock.sleep(20);'||chr(10)||'end;';

    --Print for debugging.
    --dbms_output.put_line(v_sql);

    execute immediate v_sql;
end;
/



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL डेवलपर में डेटा आयात करते समय टाइमस्टैम्प पढ़ना

  2. ANTLR4 के साथ शामिल PL/SQL व्याकरण का परीक्षण कैसे किया जा सकता है?

  3. एक ही SQL क्वेरी में WITH और UPDATE स्टेटमेंट का उपयोग करना

  4. एक्सेल VBA 64 बिट (DSN कम और tnsnames) का उपयोग करके ODBC (OLEDB नहीं) के लिए Oracle 11g ado कनेक्शन स्ट्रिंग्स

  5. क्या विजुअल स्टूडियो 2012 लोड टेस्टिंग लिनक्स सर्वर और ओरेकल डेटा बेस के प्रदर्शन काउंटरों को कैप्चर कर सकता है?