Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> डेटाबेस

Oracle 19c SQL क्वारंटाइन के साथ रनअवे क्वेरी को रोकें

यह ब्लॉग पोस्ट SQL क्वारंटाइन की अवधारणा का परिचय देता है। Oracle® रिसोर्स मैनेजर का उपयोग करके, आप CPU और I/O जैसे संसाधनों के उपयोग को नियंत्रित और सीमित कर सकते हैं। सबसे दिलचस्प तथ्य यह है कि आप किसी भी लंबे समय तक चलने वाले क्वेरी के निष्पादन को रोक सकते हैं जो एक परिभाषित सीमा से अधिक हो जाती है।

SQL क्वारंटाइन क्या है?

क्वारंटाइन का अर्थ है अलगाव। SQL क्वारंटाइन एक संस्करण 19c सुविधा है जिसका उपयोग आप रनअवे क्वेरी के ओवरहेड को खत्म करने के लिए कर सकते हैं। रनअवे क्वेरी वे हैं जो Resource Manager द्वारा समाप्त हो जाती हैं क्योंकि वे संसाधन या रनटाइम सीमा से अधिक हो जाती हैं और बहुत सारे संसाधनों, CPU, और I/O का उपयोग करती हैं।

यह सुविधा केवल Exadata (इंजीनियर्ड सिस्टम पर Oracle Database Enterprise Edition) और DBCS/ExaCS (Oracle Database Exadata Cloud Service) के लिए उपलब्ध है। इसका परीक्षण करने के लिए, मैंने अंडरस्कोर पैरामीटर सेट किया और निम्न कमांड का उपयोग करके डेटाबेस को बाउंस किया:

 Alter system set"_exadata_feature_on"=true scope=spfile; 

लंबे समय तक चलने वाले क्वेरी के बारे में क्या?

डेटाबेस रिसोर्स मैनेजर (DBRM) एक बैकग्राउंड प्रक्रिया है जो आपको एक SQL स्टेटमेंट को समाप्त करने देती है जो IO और CPU जैसे कुछ संसाधन उपयोग सीमा से अधिक हो जाता है। यह उन क्वेरी को भी समाप्त कर सकता है जो अधिकतम रन-टाइम सीमा से अधिक हो जाती हैं।

कोई भी चिह्नित SQL निष्पादन योजना और SQL स्टेटमेंट जो सीमा से अधिक हो जाता है, क्वारंटाइन हो जाता है, जिसका अर्थ है कि यदि वही SQL फिर से चलता है, उसी निष्पादन योजना का उपयोग करके, SQL स्टेटमेंट समाप्त हो जाएगा और निम्न त्रुटि दिखाएगा:

 error: ORA-56955: quarantined plan used. 

जब ये त्रुटियां होती हैं, तो ऑब्जेक्ट क्वारंटाइन उस ऑब्जेक्ट को अलग करता है जिसने त्रुटि का कारण बना और फिर डेटाबेस के बाकी हिस्सों पर इसके प्रभाव को देखने के लिए इसकी निगरानी करता है।

मैं टेबल और इंडेक्स की बात नहीं कर रहा हूं, बल्कि उन ऑब्जेक्ट्स की बात कर रहा हूं जिन्हें Oracle क्वारंटाइन कर सकता है, जिनमें सेशन, प्रोसेस, SGA ट्रांजैक्शन, और लाइब्रेरी कैश शामिल हैं।

अब आप किसी भी SQL क्वेरी को समाप्त या रद्द कर सकते हैं जो समय की दी गई सीमा से अधिक समय तक चलती है, जैसे निम्न उदाहरण:

Oracle 19c SQL क्वारंटाइन के साथ रनअवे क्वेरी को रोकें

चित्र 1: रनअवे SQL स्टेटमेंट छवि स्रोत: https://www.oracle.com/technetwork/database/bi-datawarehousing/twp-optimizer-with-oracledb-19c-5324206.pdf

क्वारंटाइन ऑब्जेक्ट्स के बारे में पता करें

https://dbaparadise.com/2020/01/everything-you-need-to-know-about-quarantined-objects/ के अनुसार: क्वारंटाइन ऑब्जेक्ट्स के बारे में जानकारी प्राप्त करने के लिए, आप V$QUARANTINE और V$QUARANTINE_SUMMARY व्यू को क्वेरी कर सकते हैं, जो आपको ऑब्जेक्ट का प्रकार, ऑब्जेक्ट का मेमोरी एड्रेस, वास्तविक ORA- त्रुटि, और त्रुटि की तारीख और समय बताते हैं।

निम्न उदाहरण में दिखाया गया है, आप मान सकते हैं कि सर्वर में CPU उपयोग रनअवे क्वेरी की प्रतिक्रिया की तरह दिखता है जब निष्पादित किया जाता है। हम तीन क्वेरी को एक साथ चलते हुए देख सकते हैं, CPU का उपयोग लगभग 100% क्षमता तक करते हुए।

Oracle 19c SQL क्वारंटाइन के साथ रनअवे क्वेरी को रोकें

चित्र 2: रनअवे SQL द्वारा उपभोग CPU छवि स्रोत: https://www.oracle.com/technetwork/database/bi-datawarehousing/twp-optimizer-with-oracledb-19c-5324206.pdf

SQL क्वारंटाइन

आप रनअवे क्वेरी के ओवरहेड को खत्म करने के लिए SQL क्वारंटाइन का उपयोग कर सकते हैं। जब रिसोर्स मैनेजर एक SQL स्टेटमेंट का पता लगाता है जो संसाधन या रन-टाइम सीमा से अधिक हो जाता है, तो स्टेटमेंट द्वारा उपयोग की जाने वाली SQL निष्पादन योजना क्वारंटाइन हो जाती है।

यदि वही SQL स्टेटमेंट उसी SQL योजना का उपयोग करके निष्पादित होता है, तो यह तुरंत समाप्त हो जाता है। यह सिस्टम संसाधन उपयोग को महत्वपूर्ण रूप से कम करने में मदद करता है। निम्न आकृति में, आप कुछ क्वेरी निष्पादित होने पर उच्च उपयोग देख सकते हैं। हालांकि, क्वारंटाइन होने से पहले उन्हें समाप्त करके, वे क्वारंटाइन होने के बाद सिस्टम संसाधनों का उपभोग नहीं करते हैं।

Oracle 19c SQL क्वारंटाइन के साथ रनअवे क्वेरी को रोकें

चित्र 3: SQL क्वारंटाइन द्वारा बचाया गया CPU छवि स्रोत: https://www.oracle.com/technetwork/database/bi-datawarehousing/twp-optimizer-with-oracledb-19c-5324206.pdf

क्वारंटाइन सुविधा का उपयोग करने के चरण

आइए सुविधा और यह कैसे काम करती है, इसकी जांच करें।

सबसे पहले, आपको डेटाबेस को सेट करना होगा क्योंकि आप Exadata पर काम कर रहे हैं।

 alter system set "_exadata_feature_on"=true scope=spfile; shutdown immediate; startup; 

फिर, आपको Resource Manager को सेटअप करने के लिए निम्नलिखित चरणों को पूरा करने की आवश्यकता है:

  1. एक पेंडिंग क्षेत्र बनाना:

     begin dbms_resource_manager.create_pending_area(); end; / 
  2. एक या अधिक रिसोर्स कंज्यूमर ग्रुप बनाएं:

     begin dbms_resource_manager.create_consumer_group(CONSUMER_GROUP=>'. SQL_LIMIT',COMMENT=>'consumer group'); end; / 
  3. रिसोर्स प्लान बनाएं:

     begin dbms_resource_manager.set_consumer_group_mapping(attribute => 'ORACLE_USER',value => 'DBA1',consumer_group =>'SQL_LIMIT' ); dbms_resource_manager.create_plan(PLAN=> 'NEW_PLAN',COMMENT=>'Kill statement after exceeding total execution time'); end; / 
  4. रिसोर्स प्लान निर्देश बनाएं। CANCEL_SQL ग्रुप डिफ़ॉल्ट रूप से पहले से मौजूद है:

     begin dbms_resource_manager.create_plan_directive( plan => 'NEW_PLAN', group_or_subplan => 'SQL_LIMIT', comment => 'Kill statement after exceeding total execution time', switch_group=>'CANCEL_SQL', switch_time => 10, switch_estimate=>false); end; / begin dbms_resource_manager.create_plan_directive(PLAN=> 'NEW_PLAN', GROUP_OR_SUBPLAN=>'OTHER_GROUPS',COMMENT=>'leave others alone', CPU_P1=>100 ); end; / 
  5. प्लान, कंज्यूमर ग्रुप, और निर्देशों के लिए पेंडिंग क्षेत्र को मान्य और सबमिट करें:

     begin dbms_resource_manager.validate_pending_area(); end; / begin dbms_resource_manager.submit_pending_area(); end; / 

यहां आपको विशेषाधिकार प्रदान करने और उपयोगकर्ताओं को कंज्यूमर ग्रुप असाइन करने की आवश्यकता है।

  1. विशेषाधिकारों, भूमिकाओं, और असाइन किए गए उपयोगकर्ताओं के लिए एक पेंडिंग क्षेत्र बनाएं:

     begin dbms_resource_manager.create_pending_area(); end; / 
  2. उपयोगकर्ताओं या भूमिकाओं को रिसोर्स कंज्यूमर ग्रुप के लिए स्विच विशेषाधिकार प्रदान करें।

     begin dbms_resource_manager_privs.grant_switch_consumer_group('DBA1','SQL_LIMIT',false); end; / 
  3. उपयोगकर्ताओं को रिसोर्स कंज्यूमर ग्रुप असाइन करें।

     begin dbms_resource_manager.set_initial_consumer_group('DBA1','SQL_LIMIT'); end; / 
  4. पेंडिंग क्षेत्रों को मान्य और सबमिट करें।

     begin dbms_resource_manager.validate_pending_area(); end; / begin dbms_resource_manager.submit_pending_area(); end; / 
  5. अब, आपको प्लान को अपडेट करना होगा और फिर से पेंडिंग क्षेत्र सबमिट करना होगा।

    begin dbms_resource_manager.clear_pending_area; dbms_resource_manager_create_pending_area; end; / begin dbms_resource_manager.update_plan_directive(plan=>'NEW_PLAN',group_or_subplan=>'SQL_LIMIT',new_switch_elapsed_time=>10, new_switch_for_call=>TRUE,new_switch_group=>'CANCEL_SQL'); end; / begin dbms_resource_manager.validate_pending_area(); dbms_resource_manager.submit_pending_area; end; / 

अगले चरण

पहले के चरण Resource Manager सेटअप को पूरा करते हैं। उन्हें पूरा करने के बाद, आपको बस इस प्लान को एक इंस्टेंस को असाइन करना होगा:

ALTER SYSTEM SET RESOURCE_MANAGER_PLAN=NEW_PLAN; 

DBA1 उपयोगकर्ता के साथ लॉग इन करें और एक क्वेरी जारी करें जो रिसोर्स प्लान में परिभाषित 10 सेकंड के बीते समय की सीमा से अधिक हो।

आपको स्टेटमेंट को DBA1 उपयोगकर्ता के रूप में निष्पादित करना होगा, और DBA1 के पास DBA व्यू तक पहुंच होनी चाहिए।

select a.owner_name,b.product_name,c.location,d.country_code from import_pr_table a, item_table b, locate_dealer_table c,country_table d; ERROR at line 1: ORA-00040: active time limit exceeded - call aborted 

ध्यान दें कि इस मामले में, Resource Manager ने ORA-00040 त्रुटि के साथ निष्पादन समाप्त कर दिया।

क्या आप स्टेटमेंट का SQL_ID ढूंढ सकते हैं? यह 3hdkutq4krg4c है।

SQL क्वारंटाइन बनाएं

आप एक SQL स्टेटमेंट के निष्पादन योजना के लिए क्वारंटाइन कॉन्फ़िगरेशन बनाने के लिए DBMS_SQLQ पैकेज का उपयोग कर सकते हैं जिसे क्वारंटाइन करने की आवश्यकता है।

आप क्वारंटाइन किए जाने वाले स्टेटमेंट के SQL टेक्स्ट या SQL_ID का उपयोग कर सकते हैं, जैसा कि निम्न उदाहरण में दिखाया गया है:

CREATE_QUARANTINE_BY_SQL_ID or CREATE_QUARANTINE_BY_SQL_TEXT DECLARE quarantine_sql VARCHAR2(30); BEGIN quarantine_sql := DBMS_SQLQ.CREATE_QUARANTINE_BY_SQL_ID(SQL_ID => '3hdkutq4krg4c'); END; / 

इस क्वारंटाइन कॉन्फ़िगरेशन को बनाने के बाद, आप DBMS_SQLQ.ALTER_QUARANTINE प्रक्रिया का उपयोग करके क्वारंटाइन सीमा निर्दिष्ट कर सकते हैं।

BEGIN DBMS_SQLQ.ALTER_QUARANTINE( QUARANTINE_NAME => 'SQL_QUARANTINE_3hdkutq4krg4c', PARAMETER_NAME => 'ELAPSED_TIME', PARAMETER_VALUE => '10'); END; / 

अब आप DBA_SQL_QUARANTINE व्यू को क्वेरी कर सकते हैं कि कौन सा SQL स्टेटमेंट क्वारंटाइन है।

SQL क्वारंटाइन लागू होने के बाद, यदि आप वही SQL स्टेटमेंट चलाने का प्रयास करते हैं तो यह निष्पादित नहीं होता है।

select a.owner_name,b.product_name,c.location,d.country_code from import_pr_table a, item_table b, locate_dealer_table c,country_table d; ERROR at line 1: ORA-56955: quarantined plan used 

पहले का त्रुटि संदेश बताता है कि इस स्टेटमेंट के लिए उपयोग की गई योजना एक क्वारंटाइन योजना का हिस्सा है। इसने क्वेरी को रद्द कर दिया क्योंकि इसने सीमा पार कर ली है।

यदि आप V$SQL व्यू की जांच करते हैं, तो आप दो नए कॉलम देखते हैं: sql_quarantine और avoided_executions:

select sql_quarantine,avoided_executions from v$sql where sql_id='3hdkutq4krg4c'; SQL> select sql_quarantine,avoided_executions 2 from v$sql where sql_id='3hdkutq4krg4c'; SQL_QUARANTINE AVOIDED_EXECUTIONS --------------- --------------- SQL_QUARANTINE_3hdkutq4krg4c 1 

निष्कर्ष

SQL क्वारंटाइन सुविधा प्रदर्शन को बेहतर बनाने में मदद करती है क्योंकि यह एक महंगे, क्वारंटाइन SQL स्टेटमेंट के भविष्य के निष्पादन को रोकती है।

कोई टिप्पणी करने या प्रश्न पूछने के लिए फीडबैक टैब का उपयोग करें। आप सेल्स चैट पर क्लिक करके अभी चैट कर सकते हैं और बातचीत शुरू कर सकते हैं।


  1. SQL Server Query Store मास्टर करें: क्वेरी प्रदर्शन को कैप्चर, विश्लेषण और हल करें SQL Server Query Store मास्टर करें: क्वेरी प्रदर्शन को कैप्चर, विश्लेषण और हल करें

    माइक्रोसॉफ्ट® SQL Server® Query Store, जैसा कि नाम से पता चलता है, एक स्टोर की तरह है जो निष्पादित क्वेरी, क्वेरी रनटाइम निष्पादन आंकड़े, और निष्पादन योजनाओं के डेटाबेस इतिहास को कैप्चर करता है। चूंकि डेटा डिस्क पर संग्रहीत होता है, आप किसी भी समय समस्या निवारण उद्देश्यों के लिए क्वेरी स्टोर डेटा पु

  1. स्ट्रेच डेटाबेस: कुशल डेटा प्रबंधन के लिए एक सरल गाइड स्ट्रेच डेटाबेस: कुशल डेटा प्रबंधन के लिए एक सरल गाइड

    नमस्कार, सभी को। मैं एक बहुत ही सरल लेकिन शानदार विषय के साथ यहां हूं जो कुछ तरीकों से हमारे डेटाबेस (DB) को बेहतर बनाने में मदद करता है—स्ट्रेच डेटाबेस!! तो, चलिए शुरू करते हैं। स्ट्रेच डेटाबेस क्या है? SQL 2016 ने एक सुविधा पेश की जो ऑन-प्रिमाइसेस से Azure क्लाउड तक डेटा को स्ट्रेच करने में हमारी

  1. सामान्य SQL PolyBase सेटअप मुद्दों को हल करें: एक व्यावहारिक मार्गदर्शिका सामान्य SQL PolyBase सेटअप मुद्दों को हल करें: एक व्यावहारिक मार्गदर्शिका

    मेरे सबसे हालिया ब्लॉग पोस्ट में, Unified data platform and data virtualization through PolyBase: Part Two, मैंने PolyBase के माध्यम से डेटा वर्चुअलाइज़ेशन का डेमो प्रदान किया। SQL PolyBase डेमो को बाहरी स्रोतों से डेटा लाने के लिए सेट करते समय, मुझे कुछ समस्याओं का सामना करना पड़ा। हालांकि मैंने सम