เสียงที่ชอบแพคเกจ 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