首页 > 数据库 > Oracle > query_rewrite 查询重写
在不能修改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/ ,如需转载,请注明出处,否则将追究法律责任。