更新时间: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)

相关文档