
# DSL规则引擎最佳实践
基于DSL的规则引擎的使用受GUC参数控制，所以需要打开相关的参数才可以生效（enable_dsl_ruleengine = ON）。
下面给出最佳实践样例。
![](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
最佳实践中系统函数的调用权限请查看以下章节的相关说明：
- 非透明多写特性：请参见《参考》中"SQL参考 \> 函数和操作符 \> DSL规则管理函数"章节。
 
- 场景一：拥有权限的合法用户可以通过调用dsl_add_rule的函数接口添加一条DSL规则。
  ```
  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)
  ```
  
 
