Característica de sustitución de SQL en Oracle 10g

9

Hace tres o cuatro años leí en un blog de Oracle en alguna parte que un DBA había utilizado para una resolución de incidente de emergencia una característica de Oracle 10g de sustitución SQL en tiempo real. Básicamente, configuró Oracle de manera que cada vez que recibía una determinada consulta A ejecutaba otra consulta B en su lugar. Sin cambio de código de aplicación, sin cambio de esquema, solo un simple tipo de configuración "ejecutar consulta B en lugar de A".

No es que esté planeando usar esa función (puedo pensar en algunas consecuencias indeseables), pero por curiosidad ¿existe realmente? En caso afirmativo, ¿cómo se llama esa característica?

caldo
fuente
Contornos
1
@ Phil: pensé que los contornos almacenados eran solo para planes de ejecución. ¿Es posible usarlos para sustituir consultas reales de la manera que describe el OP?
FrustratedWithFormsDesigner
1
Sí, puede cambiar el texto SQL usando Contornos. He hecho esto antes en 9i para modificar una consulta para agregar un par de sugerencias. Esto muestra cómo se hace: practicalappsdba.wordpress.com/2007/05/18/… - No veo por qué no puede cambiar la consulta siempre que la entrada y la salida sigan siendo las mismas: los contornos se evalúan y sustituyen en tiempo de análisis
Philᵀᴹ
1
También podría ser una vista materializada con reescritura de consultas habilitada.
a_horse_with_no_name

Respuestas:

4

Eso suena como el paquete DBMS_ADVANCED_REWRITE . Tim Hall tiene un excelente recorrido sobre el uso de ese paquete para dirigir las consultas de una aplicación a una tabla o vista diferente .

Si simplemente desea cambiar el plan de consulta pero no dirigir la consulta a una tabla diferente, puede usar esquemas almacenados o perfiles SQL.

Por ejemplo, tengo tablas FOOcon 1 fila y BARcon 2 filas

SQL> select * from foo;

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

SQL> select * from bar;

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

Puedo declarar una equivalencia de reescritura diciendo que las consultas en su FOOlugar deberían golpearBAR

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

Ahora, si configuro la query_rewrite_integrityopción de confianza, las consultas en contra FOOterminan golpeando una tabla completamente diferente.

SQL> alter session set query_rewrite_integrity=trusted;

Session altered.

SQL> select * from foo;

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

Eso puede crear algunos planes de consulta bastante interesantes donde el objeto que está consultando no se encuentra en ninguna parte del plan.

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
fuente