更新时间:2026-07-28 GMT+08:00
DSL规则引擎最佳实践
基于DSL的规则引擎的使用受GUC参数控制,所以需要打开相关的参数才可以生效(enable_dsl_ruleengine = ON)。
下面给出最佳实践样例。
最佳实践中系统函数的调用权限请查看以下章节的相关说明:
- 非透明多写特性:请参见《参考》中“SQL参考 > 函数和操作符 > DSL规则管理函数”章节。
- 场景一:拥有权限的合法用户可以通过调用dsl_add_rule的函数接口添加一条DSL规则。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
gaussdb=# SELECT dsl_add_rule( 'compute_const', 'QUERY<> {FILTER: $expr: *} => QUERY<> {FILTER: (expr_compute $expr)} ', 777, true); dsl_add_rule --------------- compute_const (1 row) -- 加载新规则,使规则可以被应用 gaussdb=# SELECT dsl_reload_rule(); dsl_reload_rule ----------------- success (1 row)
- 场景二:拥有权限的合法用户可以通过执行SQL语句查询系统表中支持的DSL规则。
-- 切换扩展显示模式,便于观察计划 gaussdb=# \x Expanded display is on. gaussdb=# SELECT * FROM GS_DSL_REWRITERULE WHERE rulename = 'compute_const'; -[ RECORD 1 ]---+--------------------------------------- rulename | compute_const ruledesc | enabled | t externalrule | t costbased | f priority | 777 dbcompatibility | 31 planmode | 3 createtime | xxxx-xx-xx xx:xx:xx.596976+08 lastupdatetime | rulehash | xxxxxxxxxxxxxxxxx ruletext | QUERY<> {FILTER: $expr: *} | => | QUERY<> {FILTER: (expr_compute $expr)} |
- 场景三:拥有权限的合法用户可以通过调用dsl_set_rule的函数接口修改系统表中的DSL规则。
-- 设置rule_name为compute_const的规则,priority属性为8 gaussdb=# SELECT dsl_set_rule('compute_const', 'priority', '778'); -[ RECORD 1 ]+-- dsl_set_rule | 1 gaussdb=# SELECT * FROM GS_DSL_REWRITERULE WHERE rulename = 'compute_const'; -[ RECORD 1 ]---+--------------------------------------- rulename | compute_const ruledesc | enabled | t externalrule | t costbased | f priority | 778 --规则优先级被设置为8 dbcompatibility | 31 planmode | 3 createtime | xxxx-xx-xx xx:xx:xx.596976+08 lastupdatetime | xxxx-xx-xx xx:xx:xx.822819+08 rulehash | xxxxxxxxxxxxxxxxxxxxx ruletext | QUERY<> {FILTER: $expr: *} | => | QUERY<> {FILTER: (expr_compute $expr)} |
- 场景四:应用规则对满足条件的SQL进行查询改写。
-- 设置开启使用DSL规则引擎 gaussdb=# SET enable_dsl_ruleengine = ON; SET gaussdb=# SHOW enable_dsl_ruleengine; enable_dsl_ruleengine ----------------------- on (1 row) -- 设置开启使用DSL规则日志打印 gaussdb=# set logging_module = 'on(OPT_DSL_REWRITE)'; SET -- 关闭扩展显示模式 gaussdb=# \x Expanded display is off. gaussdb=# EXPLAIN(VERBOSE ON) SELECT * FROM t1 WHERE t1.a = 1 OR TRUE; NOTICE: Query with blockname(sel$1) is rewritten by Gs_Rewriter: SELECT a FROM public.t1 WHERE true; with rule_name compute_const QUERY PLAN ------------------------------------------------------------- [Parameterized] Seq Scan on public.t1 (cost=0.00..34.02 rows=2402 width=4) Output: a (3 rows)
- 场景五:拥有权限的合法用户可以通过调用dsl_del_rule接口删除一条已经存在DSL规则,参数为规则名。
gaussdb=# SELECT dsl_del_rule('compute_const'); dsl_del_rule -------------- 1 (1 row) -- 删除缓存中的规则 gaussdb=# SELECT dsl_reload_rule(); dsl_reload_rule ----------------- success (1 row)
父主题: 基于DSL的规则引擎