Funzione di sostituzione SQL in Oracle 10g


9

Tre o quattro anni fa ho letto in un blog Oracle da qualche parte che un DBA aveva usato per la risoluzione di un incidente di emergenza una funzionalità Oracle 10g di sostituzione SQL in tempo reale. Fondamentalmente, ha configurato Oracle in modo tale che ogni volta che riceveva una determinata query A eseguiva invece un'altra query B. Nessuna modifica del codice dell'applicazione, nessuna modifica dello schema, solo un semplice tipo di configurazione "esegui query B anziché A".

Non che sto pianificando di usare quella funzione (posso pensare ad alcune conseguenze indesiderabili), ma per curiosità esiste davvero? Se sì, come si chiama quella funzione?




1
@Phil: pensavo che i contorni memorizzati fossero solo per i piani di esecuzione. È possibile utilizzarli per sostituire le query effettive nel modo descritto dall'OP?
FrustratedWithFormsDesigner

1
Sì, puoi modificare il testo SQL usando Contorni. L'ho già fatto in 9i per modificare una query per aggiungere un paio di suggerimenti. Questo mostra come viene fatto: practiceappsdba.wordpress.com/2007/05/18/… - Non vedo perché non è possibile modificare la query finché l'input e l'output rimangono gli stessi - i contorni vengono valutati e sostituiti al momento
dell'analisi

1
Potrebbe anche essere una vista materializzata con la riscrittura delle query abilitata.
a_horse_with_no_name

Risposte:


4

Sembra il pacchetto DBMS_ADVANCED_REWRITE . Tim Hall ha un'eccellente guida all'uso di quel pacchetto per puntare le domande di un'applicazione su una tabella o vista diversa .

Se si desidera semplicemente modificare il piano di query ma non puntare la query su una tabella diversa, è possibile utilizzare profili memorizzati o profili SQL.

Ad esempio, ho tabelle FOOcon 1 riga e BARcon 2 righe

SQL> select * from foo;

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

SQL> select * from bar;

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

Posso dichiarare un'equivalenza di riscrittura dicendo che le query contro FOOdovrebbero invece colpireBAR

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

Ora, se ho impostato query_rewrite_integritysu trusted, le query contro FOOfiniscono per colpire una tabella completamente diversa.

SQL> alter session set query_rewrite_integrity=trusted;

Session altered.

SQL> select * from foo;

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

Ciò può creare alcuni piani di query piuttosto interessanti in cui l'oggetto che si sta interrogando non si trova da nessuna parte nel piano

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.