对于某些只能通过修改
SQL
语句实现的优化,修改程序中的SQL语句似乎就变成了唯一的选项,对于一些历史遗留系统或其它一些不便于修改源程序的场景,可谓进退两难。但是,在达梦数据库
中还有另外一个方法可以实现不改动程序就能实现查询替换改写的功能,那就是查询重写。
DM
使用DBMS_ADVANCED_REWRITE
包实现该功能,支持对原始语句中的某些特定词的替换,以及整个语句的替换,但不支持递归和变换替换。下面介绍具体的使用方法:
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
稍显遗憾的是,启用查询重写功能必须禁用执行计划重用,但在大多数生产环境上都是
USE_PLN_POOL=1
,将静态参数设置为USE_PLN_POOL=0
,意味着必须要重启数据库生效。
alter system set 'USE_PLN_POOL'=0 SPFILE;
SP_CREATE_SYSTEM_PACKAGES (1,'DBMS_ADVANCED_REWRITE');
DBMS_ADVANCED_REWRITE.DECLARE_REWRITE_EQUIVALENCE(
'TEST_REWRITE', -- 规则名,可根据需要自行设定
'SELECT COUNT(*) FROM X1', --原始查询语句
'SELECT COUNT(*) FROM X2', --目标语句
FALSE,
'TEXT_MATCH'
);
ALTER SESSION SET QUERY_REWRITE_INTEGRITY = TRUSTED; --用户自己设置当前会话可以查询重写,默认为'ENFORCED'(不可重写)
-- 或者SYSDBA设置某个用户可以开启查询重写
SP_USER_SET_AUTO_REWRITE_FLAG('TEST',1); -- SYSDBA用户对TEST开启查询重写
SELECT COUNT(*) FROM X1; --执行结果 0
select * from SYS_REWRITE_EQUIVALENCES;
文章
阅读量
获赞