Oracle 10g中的SQL替代功能


9

三,四年前,我在一个Oracle博客上读到某处DBA曾用于紧急事件解决的实时SQL替代的Oracle 10g功能。基本上,他配置Oracle的方式是,每当它收到某个查询A时,它就会执行另一个查询B。无需更改应用程序代码,无需更改架构,只需进行简单的“执行查询B而不是A”类型的配置即可。

不是我打算使用该功能(我会想到一些不良后果),但是出于好奇,它真的存在吗?如果是,该功能称为什么?


存储概要
Philᵀᴹ


1
@Phil:我认为存储的轮廓仅用于执行计划。是否可以使用它们来替换OP描述的实际查询?
FrustratedWithFormsDesigner 2012年

1
是的,您可以使用“大纲”更改SQL文本。在9i之前,我已经完成了此操作,以修改查询以添加一些提示。这显示了它是如何完成的:Practicalappsdba.wordpress.com/2007/05/18/…-我不明白为什么只要输入和输出保持不变就不能更改查询-评估并替换了轮廓在分析时
Philᵀᴹ

1
也可以是启用查询重写的实例化视图。
a_horse_with_no_name 2012年

Answers:


4

听起来像DBMS_ADVANCED_REWRITE包。蒂姆·霍尔(Tim Hall)具有使用该软件包将应用程序查询指向其他表或视图的出色演练。

如果您只想更改查询计划,而又不想将查询指向其他表,则可以使用存储的大纲或SQL配置文件。

例如,我有FOO1行和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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.