暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

query_rewrite 查询重写

原创 张超 2025-12-02
39

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

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论