Oracle 10gのSQL置換機能


9

3〜4年前に、DBAが緊急インシデントの解決のためにリアルタイムSQL置換のOracle 10g機能を使用したというOracleブログをどこかで読みました。基本的に、彼は特定のクエリAを受信するたびに代わりに別のクエリBを実行するようにOracleを構成しました。アプリケーションコードの変更やスキーマの変更はありません。単純な「AではなくBクエリを実行する」タイプの構成のみです。

その機能を使用する予定はありませんが(いくつかの望ましくない結果が考えられます)、好奇心からそれは本当に存在しますか?はいの場合、その機能は何と呼ばれますか?


ストアド・アウトライン
Philᵀᴹ


1
@Phil:保存されたアウトラインは実行計画のためだけのものだと思いました。それらを使用して、OPが記述する方法で実際のクエリを置き換えることはできますか?
FrustratedWithFormsDesigner

1
はい、アウトラインを使用してSQLテキストを変更できます。クエリを変更していくつかのヒントを追加するために、これを9iで以前に実行しました。それがどのように行われるか、この番組:practicalappsdba.wordpress.com/2007/05/18/... -あなたが長い入力&出力は同じままのようにクエリを変更することはできませんなぜ私は表示されません-輪郭が評価&置換されています解析時
Philᵀᴹ

1
クエリの書き換えを有効にしたマテリアライズドビューにすることもできます。
a_horse_with_no_name

回答:


4

これは、DBMS_ADVANCED_REWRITEパッケージのように聞こえます。Tim Hallは、そのパッケージを使用して、アプリケーションのクエリを別のテーブルまたはビューに対してポイントする優れたウォークスルーを備えています。

クエリプランを変更するだけで、クエリを別のテーブルに向けない場合は、ストアドアウトラインまたは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_integritytrusted に設定すると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.