Recurso de substituição de SQL no Oracle 10g

9

Três ou quatro anos atrás, li em um blog da Oracle em algum lugar que um DBA havia usado para resolução de incidentes de emergência, um recurso Oracle 10g de substituição de SQL em tempo real. Basicamente, ele configurou o Oracle de maneira que, toda vez que recebia uma determinada consulta A, executava outra consulta B. Nenhuma alteração no código do aplicativo, no esquema, apenas uma configuração simples do tipo "executar consulta B em vez de A".

Não que eu esteja planejando usar esse recurso (posso pensar em algumas conseqüências indesejáveis), mas por curiosidade ele realmente existe? Se sim, como é chamado esse recurso?

caldo
fonte
Esboços armazenados
Philᵀᴹ
11
@ Phil: Eu pensei que os contornos armazenados eram apenas para planos de execução. É possível usá-los para substituir consultas reais da maneira que o OP descreve?
FrustratedWithFormsDesigner
11
Sim, você pode alterar o texto SQL usando Contornos. Eu fiz isso antes no 9i para modificar uma consulta e adicionar algumas dicas. Isso mostra como isso é feito : acticalappsdba.wordpress.com/2007/05/18/… - Não vejo por que você não pode alterar a consulta enquanto a entrada e a saída permanecem as mesmas - os contornos são avaliados e substituídos no tempo de análise
Philᵀᴹ
11
Também pode ser uma visualização materializada com a reescrita da consulta ativada.
A_horse_with_no_name

Respostas:

4

Isso soa como o pacote DBMS_ADVANCED_REWRITE . Tim Hall tem uma excelente explicação do uso desse pacote para apontar as consultas de um aplicativo em uma tabela ou exibição diferente .

Se você quiser apenas alterar o plano de consulta, mas não apontar a consulta para uma tabela diferente, poderá usar contornos armazenados ou perfis SQL.

Por exemplo, eu tenho tabelas FOOcom 1 linha e BARcom 2 linhas

SQL> select * from foo;

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

SQL> select * from bar;

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

Posso declarar uma equivalência de reescrita dizendo que as consultas contra FOOdevemBAR

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

Agora, se eu definir query_rewrite_integritycomo confiável, as consultas FOOacabam atingindo uma tabela completamente diferente.

SQL> alter session set query_rewrite_integrity=trusted;

Session altered.

SQL> select * from foo;

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

Isso pode criar alguns planos de consulta bastante interessantes, nos quais o objeto que você está consultando não pode ser encontrado em nenhum lugar

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
fonte