Fitur substitusi SQL di Oracle 10g


9

Tiga atau empat tahun yang lalu saya membaca di blog Oracle di suatu tempat bahwa DBA telah digunakan untuk resolusi insiden darurat fitur Oracle 10g substitusi SQL real-time. Pada dasarnya, ia mengkonfigurasi Oracle sedemikian rupa sehingga setiap kali menerima permintaan tertentu, ia menjalankan kueri lain B sebagai gantinya. Tidak ada perubahan kode aplikasi, tidak ada perubahan skema, hanya tipe sederhana "jalankan permintaan B alih-alih A".

Bukannya saya berencana untuk menggunakan fitur itu (saya bisa memikirkan beberapa konsekuensi yang tidak diinginkan), tetapi karena penasaran apakah itu benar-benar ada? Jika ya, apa nama fitur itu?




1
@ Phil: Saya pikir outline yang disimpan hanya untuk rencana eksekusi. Apakah mungkin untuk menggunakannya untuk mengganti pertanyaan aktual seperti yang dijelaskan OP?
FrustratedWithFormsDesigner

1
Ya, Anda dapat mengubah teks SQL menggunakan Garis Besar. Saya telah melakukan ini sebelumnya di 9i untuk memodifikasi kueri untuk menambahkan beberapa petunjuk. Ini menunjukkan bagaimana hal itu dilakukan: praktisappsdba.wordpress.com/2007/05/18/… - Saya tidak melihat mengapa Anda tidak dapat mengubah kueri selama input & output tetap sama - garis besar dievaluasi & diganti pada waktu parse
Philᵀᴹ

1
Bisa juga tampilan terwujud dengan penulisan ulang permintaan diaktifkan.
a_horse_with_no_name

Jawaban:


4

Itu terdengar seperti paket DBMS_ADVANCED_REWRITE . Tim Hall memiliki walk-through yang sangat baik dalam menggunakan paket itu untuk mengarahkan pertanyaan aplikasi terhadap tabel atau tampilan yang berbeda .

Jika Anda hanya ingin mengubah rencana kueri tetapi tidak mengarahkan kueri pada tabel yang berbeda, Anda dapat menggunakan garis besar yang tersimpan atau profil SQL.

Sebagai contoh, saya punya tabel FOOdengan 1 baris dan BARdengan 2 baris

SQL> select * from foo;

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

SQL> select * from bar;

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

Saya dapat mendeklarasikan ulang kesetaraan yang mengatakan bahwa kueri terhadap FOOsebaliknya seharusnya mengenaiBAR

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

Sekarang, jika saya disetel query_rewrite_integrityke tepercaya, kueri agar tidak FOOmengenai tabel yang sama sekali berbeda.

SQL> alter session set query_rewrite_integrity=trusted;

Session altered.

SQL> select * from foo;

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

Itu dapat membuat beberapa rencana permintaan yang agak menarik di mana objek yang Anda tanyakan tidak ditemukan di dalam paket tersebut

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.