注册
达梦INJECT_HINT功能
专栏/技术分享/ 文章详情 /

达梦INJECT_HINT功能

默默向上游 2024/05/31 1993 11 0
摘要

1 概述

达梦INJECT_HINT提供无需修改 SQL 语句但依然能按照指定的 HINT 运行语句的相关功能。
使用时有以下限制:

  1. INI 参数 ENABLE_INJECT_HINT 需设置为 1;
  2. SQL 只能是语法正确的增删改查语句;
  3. SQL 会经过系统格式化,格式化之后的 SQL 和指定的规则名称必须全局唯一;
  4. HINT 一指定,则全局生效;
  5. 可通过 SYSINJECTHINT 视图查看已指定的 SQL 语句和对应的 HINT。

2 相关函数

1、SF_INJECT_HINT

功能说明:
对指定 SQL 增加 HINT
定义:

VARCHAR 
SF_INJECT_HINT ( 
SQL_TEXT 
TEXT, 
HINT_TEXT 
TEXT, 
NAME 
VARCHAR(128), 
DESCRIPTION VARCHAR(256), 
VALIDATE 
BOOLEAN 
)

参数说明:
SQL_TEXT: 要指定 HINT 的 SQL 语句
HINT_TEXT: 要为 SQL 指定的 HINT
NAME: 可以指定名称,或者设为 NULL 让系统自动创建名称
DESCRIPTION: 对规则的详细描述,可为 NULL
VALIDATA: 规则是否生效,可为 NULL,则为默认值 TRUE
FUZZY: SQL 的匹配规则为精准匹配或模糊匹配。值为 TRUE 或 NULL 时,模糊
匹配;值为 FALSE 或缺省时,精准匹配
返回值:
执行成功返回名称,执行失败报错误信息
举例说明:
为以下语句指定 HINT 为 MMT_SIZE = 4 的精准匹配规则:

SF_INJECT_HINT('SELECT * FROM A;', 'MMT_SIZE(4)', 'TEST_INJECT', 'to test 
function of injecting hint', TRUE); 

为以下语句指定 HINT 为 MMT_SIZE = 4 的模糊匹配规则:

SF_INJECT_HINT('SELECT * FROM A;', 'MMT_SIZE(4)', 'TEST_INJECT', 'to test 
function of injecting hint', TRUE, TRUE); 

2 、SF_DEINJECT_HINT

功能说明:
对指定 SQL 撤回已增加的 HINT
定义:
INT
SF_DEINJECT_HINT (
NAME
VARCHAR(128)
)

参数说明:
NAME: 要删除的规则名称
返回值:
执行成功返回 0,执行失败返回错误码
举例说明:
为 SQL 撤回已指定的 HINT:
SF_DEINJECT_HINT(‘TEST_INJECT’);

3、SF_ALTER_HINT

功能说明:
修改已指定 HINT 的规则属性
定义:

INT 
SF_ALTER_HINT ( 
NAME 
VARCHAR(128), 
ATTRIBUTE_NAME VARCHAR(12), 
ATTRIBUTE_VALUE VARCHAR(256) 
) 

参数说明:
NAME: 要修改的规则名称
ATTRIBUTE_NAME:要修改的属性名
STATUS:规则是否生效,取值 ENABLED/DISABLED
NAME:规则名称
DESCRIPTION:规则的详细描述
ATTRIBUTE_VALUE:设置的属性值
返回值:
执行成功返回 0,执行失败返回错误码
举例说明:
让已指定的 HINT 的规则失效:

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

3 具体示例

1.创建t1测试表,并新建索引

create table t1 as select   * from dba_users;
CREATE  INDEX "IDX_USERNAME" ON "SYSDBA"."T1"("USERNAME" ASC) STORAGE(ON "MAIN", CLUSTERBTR) ;

2.查看语句执行计划,此时走了索引。

select  * from t1  where username ='SYS';
1   #NSET2: [1, 1, 628] 
2     #PRJT2: [1, 1, 628]; exp_num(18), is_atom(FALSE) 
3       #BLKUP2: [1, 1, 628]; IDX_USERNAME(T1)
4         #SSEK2: [1, 1, 628]; scan_type(ASC), IDX_USERNAME(T1), scan_range['SYS','SYS']

3、开启INJECT_HI,并指定hint让其不走索引。

SP_SET_PARA_VALUE(1,'ENABLE_INJECT_HINT',1)
SF_INJECT_HINT('select  * from t1  where username', 'NO_INDEX(t1,IDX_USERNAME)', 'TEST_INJECT', '', TRUE,TRUE); 

4、查看增加hint后的执行计划,此时执行计划走的是全表扫描。

select  * from t1  where username ='SYS';
1   #NSET2: [1, 1, 628] 
2     #PRJT2: [1, 1, 628]; exp_num(18), is_atom(FALSE) 
3       #SLCT2: [1, 1, 628]; T1.USERNAME = 'SYS'
4         #CSCN2: [1, 5, 628]; INDEX33555981(T1)
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服