我是靠谱客的博主 优秀康乃馨,最近开发中收集的这篇文章主要介绍达梦INJECT_HINT功能,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

INJECT_HINT功能介绍:

提供无需修改SQL语句但依然能按照指定的 HINT 运行语句的相关功能。

使用限制

INI 参数 ENABLE_INJECT_HINT 需设置为 1;
(ENABLE_INJECT_HINT 默认值:0; 动态,会话级;是否启用 SQL 指定 HINT 的功能,0:不启用;1:启用)

SQL 只能是语法正确的增删改查语句;
SQL 会经过系统格式化,格式化之后的 SQL 和指定的规则名称必须全局唯一;
HINT 一指定,则全局生效;
系统检查 SQL 匹配时,SQL_TEXT部分必须完全匹配(多一个空格也不行),不能对sql格式化,否则匹配不上不会走指定的hint,老期的版本只支持全语句的匹配。

使用方法

SF_INJECT_HINT(‘需要加hint的sql(支持绑定变量)’,‘INDEX(TEST,IDX_TEST_ID)’, ‘INJECT1’, ‘test injecting hint’, TRUE);
INDEX(TEST,IDX_TEST_ID) --该项为所加的hint
INJECT1 --指定名称,可不指定,则系统自动创建
test injecting hint --指定的hint描述,可为NULL
TRUE --规则是否生效,可为NULL,默认为TRUE

示例:

SQL> create table test(id int,info varchar);
操作已执行

SQL> insert into test select level,'a' from dual connect by level <=10000;
影响行数 10000


SQL> create index idx_test_id on test(id);
操作已执行

SQL> stat 100 on test(id);
操作已执行

SQL> explain select * from test where id>1; --正常是走全表扫描
1   #NSET2: [1, 9999, 60] 
2     #PRJT2: [1, 9999, 60]; exp_num(3), is_atom(FALSE) 
3       #SLCT2: [1, 9999, 60]; TEST.ID > 1
4         #CSCN2: [1, 10000, 60]; INDEX33555470(TEST)

SQL> sp_set_para_value(1,'ENABLE_INJECT_HINT',1); --开启ENABLE_INJECT_HINT参数
DMSQL 过程已成功完成

SQL> SF_INJECT_HINT('select * from test where id>1;','INDEX(TEST,IDX_TEST_ID)','INJECT1','test injecting hint', TRUE,TRUE);指定该语句使用IDX_TEST_ID索引
DMSQL 过程已成功完成

SQL> explain select * from test where id>1; --再次查询走了索引
1   #NSET2: [10, 9999, 60] 
2     #PRJT2: [10, 9999, 60]; exp_num(3), is_atom(FALSE) 
3       #BLKUP2: [10, 9999, 60]; IDX_TEST_ID(TEST)
4         #SSEK2: [10, 9999, 60]; scan_type(ASC), IDX_TEST_ID(TEST), scan_range(1,max]

使用SF_DEINJECT_HINT 删除 SQL增加的HINT规则
SF_DEINJECT_HINT(‘INJECT1’);

使用SF_ALTER_HINT禁用或启用已指定的HINT规则
SF_ALTER_HINT(‘INJECT1’, ‘STATUS’, ‘DISABLED’);

可通过SYSINJECTHINT视图查看已添加的HINT规则;

最后

以上就是优秀康乃馨为你收集整理的达梦INJECT_HINT功能的全部内容,希望文章能够帮你解决达梦INJECT_HINT功能所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部