ฟีเจอร์การทดแทน SQL ใน Oracle 10g


9

สามหรือสี่ปีที่แล้วฉันอ่านในบล็อกของออราเคิลที่ไหนสักแห่งที่ DBA ใช้เพื่อแก้ไขเหตุการณ์ฉุกเฉินคุณลักษณะ Oracle 10g ของการทดแทน SQL แบบเรียลไทม์ โดยทั่วไปเขาได้กำหนดค่า Oracle ในแบบที่ทุกครั้งที่ได้รับการสืบค้น A ที่ดำเนินการแบบสอบถามอื่น B ​​แทน ไม่มีการเปลี่ยนแปลงรหัสแอปพลิเคชันไม่มีการเปลี่ยนแปลง schema เพียงแค่ "เรียกใช้แบบสอบถาม B แทนการกำหนดค่าประเภท"

ไม่ใช่ว่าฉันกำลังวางแผนที่จะใช้คุณลักษณะนั้น (ฉันสามารถนึกถึงผลที่ไม่พึงประสงค์บางอย่าง) แต่มันมีอยู่จริงหรือไม่? ถ้าใช่คุณสมบัตินั้นเรียกว่าอะไร?


โครงร่างที่เก็บไว้
Philᵀᴹ


1
@ ฟิล: ฉันคิดว่าโครงร่างที่เก็บไว้มีไว้สำหรับแผนการดำเนินการเท่านั้น เป็นไปได้ไหมที่จะใช้คำสั่งแทนที่ข้อความค้นหาจริงตามที่ OP อธิบาย?
FrustratedWithFormsDesigner

1
ใช่คุณสามารถเปลี่ยนข้อความ SQL โดยใช้เค้าร่าง ฉันทำสิ่งนี้มาก่อนใน 9i เพื่อปรับเปลี่ยนแบบสอบถามเพื่อเพิ่มคำแนะนำสองสามข้อ สิ่งนี้แสดงให้เห็นว่าทำอย่างไร: Practicalappsdba.wordpress.com/2007/05/18/ … - ฉันไม่เห็นสาเหตุที่คุณไม่สามารถเปลี่ยนคำถามได้ตราบใดที่อินพุทและเอาท์พุทยังคงเหมือนเดิม - มีการประเมินโครงร่าง & ทดแทน ในช่วงเวลาที่แยกวิเคราะห์
Philᵀᴹ

1
อาจเป็นมุมมอง materialized ที่เปิดใช้งานการเขียนแบบสอบถาม
a_horse_with_no_name

คำตอบ:


4

เสียงที่ชอบแพคเกจ DBMS_ADVANCED_REWRITE ทิมฮอลล์มีเดินผ่านของการใช้แพคเกจที่ยอดเยี่ยมที่จะชี้คำสั่งของโปรแกรมประยุกต์กับตารางที่แตกต่างกันหรือมุมมอง

ถ้าคุณเพียงต้องการเปลี่ยนแผนแบบสอบถาม แต่ไม่ชี้แบบสอบถามที่ตารางอื่นคุณสามารถใช้โครงร่างที่เก็บไว้หรือโปรไฟล์ SQL

ตัวอย่างเช่นฉันมีตารางที่FOOมี 1 แถวและ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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.