remap_rewrites

remap_rewrites 是一个会话作用域的系统变量,以 JSON 对象形式存放查询改写规则;当 enable_remap_hint 启用时,这些规则会应用于会话中的每条查询。

描述

remap_rewrites 是一个会话作用域的系统变量,以 JSON 对象形式存放查询改写规则。当 enable_remap_hint 启用时,这些规则会应用于会话中的每条查询。

该值接受两种规则:

  • 表改写规则,将限定的 database.table 名称映射为替换用的 SELECT 语句。

  • remapdb 规则,将源数据库名映射为目标数据库名。

将变量设为 '' 会清除会话规则。该值在设置时进行校验,因此无效值会被立即拒绝,之前的取值继续生效。

表改写规则

表改写规则使用与 /*+ {"rewrites": {...}} */ 优化器提示相同的载荷。裸 map 形式和包裹的 {"rewrites": {...}} 形式均可接受:

{"database.table": "select ... from database.table ..."}
{"rewrites": {"database.table": "select ... from database.table ..."}}

remapdb 规则

remapdb 规则将源数据库名映射为目标数据库名,使 source_db.table 这样的限定引用解析到 target_db.table

{"remapdb": {"source_database": "target_database"}}

两种规则可以在同一个值中组合使用,且 remapdb 会先于表改写规则应用。详见 remapdb

语法

SET remap_rewrites = '{"database.table": "select ..."}'

参数说明

remap_rewrites 接受一个值:包含 rewrites 和/或 remapdb 规则的 JSON 对象,或 '' 表示清除全部会话规则。

示例

DROP DATABASE IF EXISTS remap_rewrites_demo;
CREATE DATABASE remap_rewrites_demo;
USE remap_rewrites_demo;

CREATE TABLE t1 (a INT, b INT);
INSERT INTO t1 VALUES (1, 2), (3, 4);
SET enable_remap_hint = 1;
SET remap_rewrites = '{"remap_rewrites_demo.t1": "select a, b from remap_rewrites_demo.t1 where a > 1"}';
SELECT * FROM remap_rewrites_demo.t1;
SET remap_rewrites = '';
SET enable_remap_hint = 0;

DROP DATABASE remap_rewrites_demo;

相关参考