यह DBMS_ADVANCED_REWRITE पैकेज की तरह लगता है । टिम हॉल में एक अलग तालिका या दृश्य के खिलाफ किसी एप्लिकेशन के प्रश्नों को इंगित करने के लिए उस पैकेज का उपयोग करने का एक उत्कृष्ट चलना है ।
यदि आप केवल क्वेरी योजना को बदलना चाहते हैं, लेकिन किसी अलग तालिका में क्वेरी को इंगित नहीं करते हैं, तो आप संग्रहीत रूपरेखा या SQL प्रोफाइल का उपयोग कर सकते हैं।
उदाहरण के लिए, मेरे पास FOO
1 पंक्ति और BAR
2 पंक्तियों के साथ टेबल हैं
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