达梦数据库系列—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');
原文地址:https://blog.csdn.net/md54333/article/details/142784575
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!