达梦数据库系列—49.SQL绑定HINT

目录

第一步,DM.INI 参数 ENABLE_INJECT_HINT 设置为 1。

第二步,通过 SF_INJECT_HINT 为 SQL 注入 HINT 规则。

第三步,(可选项)使用使用 SF_ALTER_HINT 修改指定 HINT 规则。

第四步,验证是否指定成功。

第五步,(可选项)使用 SF_DEINJECT_HINT 删除 SQL 的 HINT 规则。


为 SQL 语句注入 HINT 规则,是指无需修改 SQL 语句,通过 SF_INJECT_HINT 为该 SQL 注入 HINT 规则,随后该 SQL 按照注入的 HINT 规则运行的功能。通过 SF_INJECT_HINT 注入的 HINT 称为 INJECT HINT。

使用方法:

第一步,DM.INI 参数 ENABLE_INJECT_HINT 设置为 1

select * from v$dm_ini where para_name='ENABLE_INJECT_HINT';
sp_set_para_value(1,'ENABLE_INJECT_HINT',1);

第二步,通过 SF_INJECT_HINT 为 SQL 注入 HINT 规则。

HINT 规则一经注入,就全局存在。HINT 规则名称必须全局唯一。HINT 规则的名称是指 SF_INJECT_HINT 中 name 参数指定的名称或 name 参数为 NULL 时系统自动创建的名称。

SF_INJECT_HINT

定义 1:

VARCHAR

SF_INJECT_HINT (

sql_text text,

hint_text text,

name varchar(128),

description varchar(256),

validate boolean

)

或者

定义 2:

VARCHAR

SF_INJECT_HINT (

sql_text text,

hint_text text,

name varchar(128),

description varchar(256),

validate boolean,

fuzzy boolean

)

参数说明:

sql_text:待注入 HINT 规则的 SQL 语句。

hint_text:待注入的 HINT 规则,必须指定为非 NULL 值。

name:HINT 规则的名称,指定为 NULL 值时系统为其命名。

description:对 HINT 规则的详细描述。

validate:HINT 规则是否生效。TRUE 是;FALSE 否。

FUZZY: SQL 的匹配规则为精准匹配或模糊匹配。值为 TRUE 或 NULL 时,模糊匹配;值为 FALSE 或缺省时,精准匹配

返回值:

执行成功返回名称,执行失败报错误信息。

举例说明:

进行建表操作。

DROP TABLE A;

CREATE TABLE A(C1 INT,C2 CHAR(20));
EXPLAIN SELECT * FROM A WHERE C2 LIKE '%DM%';
1  #NSET2: [1, 1, 64]

2   #PRJT2: [1, 1, 64]; exp_num(3), is_atom(FALSE)

3    #SLCT2: [1, 1, 64]; exp11 > 0

4     #CSCN2: [1, 6, 64]; INDEX33555472(A); btr_scan(1)

通过以下语句指定 HINT 为 LIKE_OPT_FLAG=0 的精准匹配规则,此时将不对 LIKE 表达式进行优化处理。

SF_INJECT_HINT('SELECT * FROM A WHERE C2 LIKE ''%DM%'';', 'LIKE_OPT_FLAG(0)', 'TEST_INJECT', 'to test function of injecting hint', TRUE);

或者:

SF_INJECT_HINT('SELECT * FROM A WHERE C2 LIKE ''%DM%'';', 'LIKE_OPT_FLAG(0)', 'TEST_INJECT', 'to test function of injecting hint', TRUE, FALSE);

在指定 HINT 为 LIKE_OPT_FLAG=0 的精准匹配规则后,执行下列语句:

EXPLAIN SELECT * FROM A WHERE C2 LIKE '%DM%';

此时不对 LIKE 表达式进行优化处理,规则生效,执行结果如下:

1  #NSET2: [1, 1, 64]

2   #PRJT2: [1, 1, 64]; exp_num(3), is_atom(FALSE)

3    #SLCT2: [1, 1, 64]; A.C2 LIKE '%DM%' SLCT_PUSHDOWN(TRUE)

4     #CSCN2: [1, 6, 64]; INDEX33555472(A) NEED_SLCT(TRUE); btr_scan(1)

通过以下语句指定 HINT 为 LIKE_OPT_FLAG=0 的模糊匹配规则:

SF_INJECT_HINT('SELECT * FROM A WHERE C2 LIKE', 'LIKE_OPT_FLAG(0)', 'TEST_INJECT', 'to test function of injecting hint', TRUE, TRUE);

或者:

SF_INJECT_HINT('SELECT * FROM A WHERE C2 LIKE', 'LIKE_OPT_FLAG(0)', 'TEST_INJECT', 'to test function of injecting hint', TRUE, NULL);

第三步,(可选项)使用使用 SF_ALTER_HINT 修改指定 HINT 规则。

本步骤为可选项,需要修改 HINT 规则时使用。

举例说明:

让指定的 HINT 规则失效:

SF_ALTER_HINT('TEST_INJECT', 'STATUS', 'DISABLED');

修改规则名,且不清空缓存的计划:

SF_ALTER_HINT('TEST_INJECT', 'NAME', 'TEST_INJECT1', FALSE);

第四步,验证是否指定成功。

通过 SYSINJECTHINT 视图查看 SQL 语句及其注入的 HINT 规则信息。

select * from SYSINJECTHINT ;

第五步,(可选项)使用 SF_DEINJECT_HINT 删除 SQL 的 HINT 规则。

本步骤为可选项,需要删除 SQL 的 HINT 规则时使用。

举例说明:

为 SQL 删除已注入的 HINT 规则:

SF_DEINJECT_HINT('TEST_INJECT');

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奥德彪的蕉

天不生我奥德彪,非洲无人拉香蕉

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值