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?


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.