注册
达梦查询重写
培训园地/ 文章详情 /

达梦查询重写

JC 2023/02/22 1336 2 0

对于某些只能通过修改SQL语句实现的优化,修改程序中的SQL语句似乎就变成了唯一的选项,对于一些历史遗留系统或其它一些不便于修改源程序的场景,可谓进退两难。但是,在达梦数据库中还有另外一个方法可以实现不改动程序就能实现查询替换改写的功能,那就是查询重写

DM使用DBMS_ADVANCED_REWRITE包实现该功能,支持对原始语句中的某些特定词的替换,以及整个语句的替换,但不支持递归和变换替换。下面介绍具体的使用方法:

使用方法

0、测试数据准备(可选)

CREATE TABLE X1(C1 INT, C2 CHAR(20)); INSERT INTO X1 VALUES(12, 'TEST12'); INSERT INTO X1 VALUES(13, 'TEST13'); INSERT INTO X1 VALUES(14, 'TEST14'); INSERT INTO X1 VALUES(15, 'TEST15'); COMMIT; CREATE TABLE X2(D1 INT, D2 CHAR(30)); SELECT COUNT(*) FROM X1; --执行结果 4

1、禁用执行计划重用

稍显遗憾的是,启用查询重写功能必须禁用执行计划重用,但在大多数生产环境上都是USE_PLN_POOL=1,将静态参数设置为USE_PLN_POOL=0,意味着必须要重启数据库生效。

alter system set 'USE_PLN_POOL'=0 SPFILE;

2、启用查询重写包

SP_CREATE_SYSTEM_PACKAGES (1,'DBMS_ADVANCED_REWRITE');

3、定义查询重写规则

DBMS_ADVANCED_REWRITE.DECLARE_REWRITE_EQUIVALENCE( 'TEST_REWRITE', -- 规则名,可根据需要自行设定 'SELECT COUNT(*) FROM X1', --原始查询语句 'SELECT COUNT(*) FROM X2', --目标语句 FALSE, 'TEXT_MATCH' );

4、设置会话或用户可以重写

ALTER SESSION SET QUERY_REWRITE_INTEGRITY = TRUSTED; --用户自己设置当前会话可以查询重写,默认为'ENFORCED'(不可重写) -- 或者SYSDBA设置某个用户可以开启查询重写 SP_USER_SET_AUTO_REWRITE_FLAG('TEST',1); -- SYSDBA用户对TEST开启查询重写

5、验证查询重写

SELECT COUNT(*) FROM X1; --执行结果 0

规则维护

  • 查看所有查询重写规则

select * from SYS_REWRITE_EQUIVALENCES;
  • 禁用或重新启用某个重写规则

    ALTER_REWRITE_EQUIVALENCE ('TEST_REWRITE','DISABLED'); --禁用规则 ALTER_REWRITE_EQUIVALENCE ('TEST_REWRITE','TEXT_MATCH'); --重新启用
  • 删除某个重写规则

    DROP_REWRITE_EQUIVALENCE('TEST_REWRITE'); --删除名字为TEST_REWRITE的查询重写规则
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服