ओरेकल 10 जी में एसक्यूएल प्रतिस्थापन सुविधा


9

तीन या चार साल पहले मैंने ओरेकल ब्लॉग में पढ़ा था कि एक डीबीए ने आपातकालीन घटना के समाधान के लिए वास्तविक समय एसक्यूएल प्रतिस्थापन के ओरेकल 10 जी फीचर का उपयोग किया था। मूल रूप से, उन्होंने ओरेकल को इस तरह से कॉन्फ़िगर किया कि हर बार इसे एक निश्चित क्वेरी ए मिले, इसके बजाय एक और क्वेरी बी निष्पादित की गई। कोई अनुप्रयोग कोड परिवर्तन, कोई स्कीमा परिवर्तन नहीं, बस एक सरल "ए के प्रकार के बजाय क्वेरी बी निष्पादित"।

ऐसा नहीं है कि मैं उस सुविधा का उपयोग करने की योजना बना रहा हूं (मैं कुछ अवांछनीय परिणामों के बारे में सोच सकता हूं), लेकिन जिज्ञासा से बाहर वास्तव में मौजूद है? यदि हाँ, तो उस सुविधा को क्या कहा जाता है?


संग्रहित रूपरेखा
Philᵀᴹ

या SQL प्रोफाइल। देखें antognini.ch/papers/SQLProfiles_20060622.pdf और oracle-base.com/articles/misc/outlines.php
Philᵀᴹ

1
@Phil: मैंने सोचा कि संग्रहीत रूपरेखाएँ केवल निष्पादन योजनाओं के लिए थीं। क्या ओपी द्वारा बताए गए तरीके से वास्तविक प्रश्नों को स्थानापन्न करना संभव है?
FrustratedWithFormsDesigner

1
हाँ, आप रूपरेखा का उपयोग करके SQL पाठ को बदल सकते हैं। मैंने 9i में इससे पहले संकेत के एक जोड़े को जोड़ने के लिए एक क्वेरी को संशोधित करने के लिए किया है। यह दिखाता है कि यह कैसे किया जाता है: व्यावहारिक appsdba.wordpress.com/2007/05/18/.... पार्स समय पर
फिलो

1
क्वेरी पुन: लिखने में सक्षम होने के साथ एक भौतिक दृष्टिकोण भी हो सकता है।
a_horse_with_no_name

जवाबों:


4

यह DBMS_ADVANCED_REWRITE पैकेज की तरह लगता है । टिम हॉल में एक अलग तालिका या दृश्य के खिलाफ किसी एप्लिकेशन के प्रश्नों को इंगित करने के लिए उस पैकेज का उपयोग करने का एक उत्कृष्ट चलना है ।

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

उदाहरण के लिए, मेरे पास FOO1 पंक्ति और BAR2 पंक्तियों के साथ टेबल हैं

SQL> select * from foo;

      COL1
----------
         1

SQL> select * from bar;

      COL1
----------
        66
        77

मैं यह कहते हुए पुनर्लेखन की घोषणा कर सकता हूं कि FOOइसके बजाय प्रश्नों को हिट होना चाहिएBAR

begin
  sys.DBMS_ADVANCED_REWRITE.DECLARE_REWRITE_EQUIVALENCE(
    'Rewrite_Foo',
    'select col1 from foo',
    'select col1 from bar',
    false,
    'TEXT_MATCH' );
end;

अब, अगर मैंने query_rewrite_integrityभरोसा किया है, तो FOOएक पूरी तरह से अलग तालिका को समाप्त करने के खिलाफ प्रश्न ।

SQL> alter session set query_rewrite_integrity=trusted;

Session altered.

SQL> select * from foo;

      COL1
----------
        66
        77

यह कुछ दिलचस्प क्वेरी प्लान बना सकता है जहाँ आप जिस ऑब्जेक्ट को क्वेरी कर रहे हैं वह योजना में कहीं भी नहीं है

SQL> select * from foo;

      COL1
----------
        66
        77


Execution Plan
----------------------------------------------------------
Plan hash value: 4224476444

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     2 |    26 |     3   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| BAR  |     2 |    26 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------

Note
-----
   - dynamic sampling used for this statement (level=2)


Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          7  consistent gets
          0  physical reads
          0  redo size
        584  bytes sent via SQL*Net to client
        523  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          2  rows processed
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.