SQL-Ersetzungsfunktion in Oracle 10g

9

Vor drei oder vier Jahren las ich irgendwo in einem Oracle-Blog, dass ein DBA für eine Notfalllösung eine Oracle 10g-Funktion zur Echtzeit-SQL-Substitution verwendet hatte. Grundsätzlich hat er Oracle so konfiguriert, dass jedes Mal, wenn es eine bestimmte Abfrage A erhielt, stattdessen eine andere Abfrage B ausgeführt wurde. Keine Änderung des Anwendungscodes, keine Schemaänderung, nur eine einfache Konfiguration vom Typ "Abfrage B anstelle von A ausführen".

Nicht, dass ich vorhabe, diese Funktion zu verwenden (ich kann mir einige unerwünschte Konsequenzen vorstellen), aber existiert sie aus Neugier wirklich? Wenn ja, wie heißt diese Funktion?

Brühe
quelle
Gespeicherte Umrisse
Philᵀᴹ
1
@Phil: Ich dachte, gespeicherte Konturen sind nur für Ausführungspläne. Ist es möglich, sie zu verwenden, um tatsächliche Abfragen so zu ersetzen, wie es das OP beschreibt?
FrustratedWithFormsDesigner
1
Ja, Sie können den SQL-Text mithilfe von Konturen ändern. Ich habe dies bereits in 9i getan, um eine Abfrage zu ändern und ein paar Hinweise hinzuzufügen. Dies zeigt, wie es gemacht wird: praktischeappsdba.wordpress.com/2007/05/18/… - Ich verstehe nicht, warum Sie die Abfrage nicht ändern können, solange die Eingabe und Ausgabe gleich bleiben - Konturen werden ausgewertet und ersetzt zur
Analysezeit
1
Könnte auch eine materialisierte Ansicht sein, bei der das Umschreiben von Abfragen aktiviert ist.
a_horse_with_no_name

Antworten:

4

Das klingt nach dem Paket DBMS_ADVANCED_REWRITE . Tim Hall verfügt über eine hervorragende Anleitung zur Verwendung dieses Pakets, um die Abfragen einer Anwendung auf eine andere Tabelle oder Ansicht zu verweisen .

Wenn Sie lediglich den Abfrageplan ändern möchten, die Abfrage jedoch nicht auf eine andere Tabelle verweisen möchten, können Sie gespeicherte Konturen oder SQL-Profile verwenden.

Zum Beispiel habe ich Tabellen FOOmit 1 Zeile und BARmit 2 Zeilen

SQL> select * from foo;

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

SQL> select * from bar;

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

Ich kann eine Umschreibäquivalenz deklarieren, die besagt, dass Abfragen gegen FOOstattdessen getroffen werden solltenBAR

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

Wenn ich mich nun query_rewrite_integrityauf vertrauenswürdig einstelle , FOOtreffen Abfragen gegen eine völlig andere Tabelle.

SQL> alter session set query_rewrite_integrity=trusted;

Session altered.

SQL> select * from foo;

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

Dadurch können einige interessante Abfragepläne erstellt werden, bei denen das von Ihnen abgefragte Objekt nirgends im Plan zu finden ist

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
Justin Cave
quelle