query_rewrite 查询重写

来源:这里教程网 时间:2026-03-03 22:55:05 作者:

在不能修改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) -------------------------------------------------------------------------------- 王玮????

相关推荐

热文推荐