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


9

Три або чотири роки тому я десь читав у блозі Oracle, що DBA використовував для вирішення надзвичайних ситуацій функцію Oracle 10 g у режимі заміни SQL у режимі реального часу. В основному, він налаштував Oracle таким чином, що кожного разу, коли він отримував певний запит A, він виконував інший запит B замість цього. Ніякої зміни коду програми, жодної зміни схеми, просто проста конфігурація типу "виконати запит B замість A".

Не те, що я планую використовувати цю функцію (я можу подумати про деякі небажані наслідки), але з цікавості це дійсно існує? Якщо так, як називається ця функція?


Збережені контури
Philᵀᴹ


1
@Phil: Я думав, що збережені контури лише для планів виконання. Чи можна використовувати їх для заміни фактичних запитів способом, описаним в ОП?
FrustratedWithFormsDesigner

1
Так, ви можете змінити текст SQL за допомогою "Контури". Я робив це раніше в 9i, щоб змінити запит, щоб додати пару підказок. Це показує, як це робиться: Practicalappsdba.wordpress.com/2007/05/18/… - Я не бачу, чому ви не можете змінити запит, доки введення та вихід залишаються однаковими - контури оцінюються та замінюються в час розбору
Philᵀᴹ

1
Також може бути матеріалізований вигляд із увімкненою перезаписом запитів.
a_horse_with_no_name

Відповіді:


4

Це звучить як пакет DBMS_ADVANCED_REWRITE . Тім Холл прекрасно використовує цей пакет для вказівки запитів програми на іншу таблицю або подання .

Якщо ви просто хочете змінити план запитів, але не вказуєте запит на іншу таблицю, ви можете використовувати збережені контури або профілі SQL.

Наприклад, у мене є таблиці FOOз 1 рядом і BARз 2 рядами

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.