Функция подстановки SQL в Oracle 10g

9

Три или четыре года назад я где-то читал в блоге Oracle, что администратор БД использовал для разрешения чрезвычайных ситуаций функцию Oracle 10g для подстановки SQL в реальном времени. По сути, он настраивал Oracle таким образом, чтобы каждый раз, когда он получал определенный запрос A, он выполнял другой запрос B вместо этого. Без изменения кода приложения, без изменения схемы, просто простой тип конфигурации «выполнить запрос B вместо A».

Не то, чтобы я планировал использовать эту функцию (я могу подумать о некоторых нежелательных последствиях), но из любопытства она действительно существует? Если да, то как называется эта функция?

b.roth
источник
Сохраненные контуры
Philᵀᴹ
1
@Phil: я думал, что сохраненные схемы были только для планов выполнения. Можно ли использовать их для замены реальных запросов так, как описывает OP?
FrustratedWithFormsDesigner
1
Да, вы можете изменить текст SQL с помощью Outlines. Я делал это раньше в 9i, чтобы изменить запрос, чтобы добавить пару подсказок. Это показывает, как это делается: Practicalappsdba.wordpress.com/2007/05/18/… - Я не понимаю, почему вы не можете изменить запрос, пока ввод и вывод остаются неизменными - контуры оцениваются и заменяются в разбор
Philᵀᴹ
1
Также может быть материализованное представление с включенным переписыванием запроса.
a_horse_with_no_name

Ответы:

4

Это похоже на пакет DBMS_ADVANCED_REWRITE . Тим Холл имеет отличное руководство по использованию этого пакета для сопоставления запросов приложения с другой таблицей или представлением .

Если вы просто хотите изменить план запроса, но не указывать запрос на другую таблицу, вы можете использовать сохраненные схемы или профили SQL.

Например, у меня есть таблицы FOOс 1 строкой и BAR2 рядами

SQL> select * from foo;

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

SQL> select * from bar;

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

Я могу объявить эквивалентность переписывания, сказав, что запросы против FOOдолжны вместоBAR

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

Теперь, если я установил query_rewrite_integrityзначение «доверенный», запросы против будут FOOпопадать в совершенно другую таблицу.

SQL> alter session set query_rewrite_integrity=trusted;

Session altered.

SQL> select * from foo;

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

Это может создать довольно интересные планы запросов, где запрашиваемый объект нигде не найден в плане.

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
Джастин Кейв
источник