ITPub博客

首页 > 数据库 > Oracle > query_rewrite 查询重写

query_rewrite 查询重写

原创 Oracle 作者:oracle11111 时间:2025-12-02 15:38:11 0 删除 编辑

在不能修改sql的情况下优化或者调整查询结果

query_rewrite 查询重写

常用的几个场景:

首先是性能优化,这是最常用的场景;然后是数据安全,比如多租户隔离和SQL注入防护;接着是系统维护和业务适配  方面的应用。


https://docs.oracle.com/cd/B13789_01/appdev.101/b10802/d_advrwr.htm#996728


首先需要的权限:

grant  execute on dbms_advanced_rewrite to zc;


grant  create materialized view to zc;



首先需要赋予用户相关的权限,我的测试环境是dba用户,测试中发现缺什么权限再赋权即可


测试过程:

原始sql:

select * from char_test2;


查询结果:

    ID NAME_CHAR

  1 王玮




希望替换成的sql:

select CASE a.id WHEN 1 THEN TO_NCHAR('王玮') || (select name_nchar from char_test where id=1) ELSE TO_NCHAR(a.name_char) END as xingming from char_test2 a;


查询结果:

    XINGMING

1 王玮𮧵


执行替换

跳过查询重写(Query Rewrite)的语义验证,让 Oracle 直接应用重写规则,不检查重写后的 SQL 是否与原始 SQL 语义等价。


SQL> ALTER SESSION SET QUERY_REWRITE_INTEGRITY = TRUSTED;


Session altered



SQL> BEGIN

  2    SYS.DBMS_ADVANCED_REWRITE.DECLARE_REWRITE_EQUIVALENCE (

  3      name             => 'test_rewrite',

  4      source_stmt      => 'SELECT TO_NCHAR(NAME_CHAR) FROM char_test2',

  5      destination_stmt => 'SELECT

  6                           CASE

  7                             WHEN a.id = 1 THEN TO_NCHAR(''王玮'') || (SELECT name_nchar FROM char_test WHERE id = 1)

  8                             ELSE TO_NCHAR(a.name_char)

  9                           END AS name_char

 10                           FROM char_test2 a',

 11      validate         => FALSE

 12    );

 13  END;

 14  /


PL/SQL procedure successfully completed


新的查询结果:


SQL> SELECT TO_NCHAR(NAME_CHAR) FROM char_test2;


TO_NCHAR(NAME_CHAR)

--------------------------------------------------------------------------------

王玮𮧵


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69924215/viewspace-3104140/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-05-19

  • 博文量
    81
  • 访问量
    90404