首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在绑定变量中使用Oracle DBMS_ADVANCED_REWRITE?

如何在绑定变量中使用Oracle DBMS_ADVANCED_REWRITE?
EN

Stack Overflow用户
提问于 2014-12-09 20:09:16
回答 1查看 1.2K关注 0票数 6

我们需要使用绑定变量实现查询重写,因为我们没有修改web应用程序源代码的选项。示例:

代码语言:javascript
复制
BEGIN
     SYS.DBMS_ADVANCED_REWRITE.declare_rewrite_equivalence (
     name             => 'test_rewrite2',
     source_stmt      => 'select COUNT(*) from ViewX where columnA = :1',
     destination_stmt => 'select COUNT(*) from ViewY where columnA = :1',
     validate         => FALSE,
     rewrite_mode     => 'recursive');    
END;

上面的命令将导致错误,因为有一个绑定变量:

代码语言:javascript
复制
30353. 00000 -  "expression not supported for query rewrite"
*Cause:    The SELECT clause referenced UID, USER, ROWNUM, SYSDATE,
           CURRENT_TIMESTAMP, MAXVALUE, a sequence number, a bind variable,
           correlation variable, a set result, a  trigger return variable, a
           parallel table queue column, collection iterator, a non-deterministic
           date format token RR, etc.
*Action:   Remove the offending expression or disable the REWRITE option on
           the materialized view.

我正在读这里,说周围有一份工作,但我只是在网上找不到文档。

你能告诉我周围的工作是什么吗?

EN

回答 1

Stack Overflow用户

发布于 2016-12-19 08:50:52

您不能指定绑定参数,但它应该已经按照您的意愿工作了。关键是您作为mode传递的mode参数。recursivegeneral模式将拦截所有涉及表(或视图)的语句,忽略筛选器,并将它们转换为目标第二个表(或视图),从原始语句中调整筛选条件。(如果您将其定义为TEXT_MATCH,它将检查原始语句和目标语句中是否存在相同的过滤器,以便触发转换。)

在下面的示例中可以看到,即使我们不定义任何绑定条件,过滤器id = 2也会被应用;换句话说,它实际上是将SELECT * FROM A1 where id = 2转换为SELECT * FROM A2 where id = 2

代码语言:javascript
复制
set LINESIZE 300

drop table A1;
drop view A2;
drop index A1_IDX;
EXEC SYS.DBMS_ADVANCED_REWRITE.drop_rewrite_equivalence (name => 'test_rewrite');

create table A1 (id number, name varchar2(20));

insert into A1 values(1, 'hello world');
insert into A1 values(2, 'hola mundo');

create index A1_IDX  on A1(id);

select * from A1;

ALTER SESSION SET QUERY_REWRITE_INTEGRITY = TRUSTED;

CREATE OR REPLACE VIEW A2 AS
SELECT id,
       INITCAP(name) AS name
FROM   A1
ORDER BY id desc;


BEGIN
  SYS.DBMS_ADVANCED_REWRITE.declare_rewrite_equivalence (
     name             => 'test_rewrite',
     source_stmt      => 'SELECT * FROM A1',
     destination_stmt => 'SELECT * FROM A2',
     validate         => FALSE,
     rewrite_mode     => 'recursive');
END;
/


select * from A1;

        ID NAME               
---------- --------------------
         2 Hola Mundo          
         1 Hello World         




select * from A1 where id = 2;


        ID NAME               
---------- --------------------
         2 Hola Mundo       


explain plan for
select * from A1 where id = 2;

select * from table(dbms_xplan.display);


PLAN_TABLE_OUTPUT                                                                                                                                                                                                                                                                                          
----------------------------------------------------------------------------------------
Plan hash value: 1034670462                                                                                                                                                                                                                                                                                 

----------------------------------------------------------------------------------------                                                                                                                                                                                                                    
| Id  | Operation                     | Name   | Rows  | Bytes | Cost (%CPU)| Time     |                                                                                                                                                                                                                    
----------------------------------------------------------------------------------------                                                                                                                                                                                                                    
|   0 | SELECT STATEMENT              |        |     1 |    25 |     2   (0)| 00:00:01 |                                                                                                                                                                                                                    
|   1 |  VIEW                         | A2     |     1 |    25 |     2   (0)| 00:00:01 |                                                                                                                                                                                                                    
|   2 |   TABLE ACCESS BY INDEX ROWID | A1     |     1 |    25 |     2   (0)| 00:00:01 |                                                                                                                                                                                                                    
|*  3 |    INDEX RANGE SCAN DESCENDING| A1_IDX |     1 |       |     1   (0)| 00:00:01 |                                                                                                                                                                                                                    
----------------------------------------------------------------------------------------                                                                                                                                                                                                                    


PLAN_TABLE_OUTPUT                                                                                                                                                                                                                                                                                          
---------------------------------------------------
Predicate Information (identified by operation id):                                                                                                                                                                                                                                                         
---------------------------------------------------                                                                                                                                                                                                                                                         

   3 - access("ID"=2)                                                                                                                                                                                                                                                                                       

Note                                                                                                                                                                                                                                                                                                        
-----                                                                                                                                                                                                                                                                                                       
   - dynamic sampling used for this statement (level=2)                                                                                                                                                                                                                                                     
   - automatic DOP: Computed Degree of Parallelism is 1 because of parallel threshold                                                                                                                                                                                                                       

 20 rows selected 

如你所见

  1. 引擎透明地应用转换并返回过滤的结果。
  2. 在此基础上,应用过滤器上的转换。过滤器被正确地“推送”到源表中,以便从A1中提取值。它不是盲目地从A2中提取所有的值,然后应用该滤波器,从而保持了性能。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27387887

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档