DM8实现类似Oracle绑定执行计划

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

使用时有以下限制:
1) INI 参数 ENABLE_INJECT_HINT 需设置为 1;
2) SQL 只能是语法正确的增删改查语句;
3) SQL 会经过系统格式化,格式化之后的 SQL 和指定的规则名称必须全局唯一;
4) HINT 一指定,则全局生效;
5) 系统检查 SQL 匹配时,必须是整条语句完全匹配,不能是语句中子查询匹配;
6) 可通过 SYSINJECTHINT 视图查看已指定的 SQL 语句和对应的 HINT。

一、命令用法
1. SF_INJECT_HINT
【定义】
VARCHAR
SF_INJECT_HINT (
    SQL_TEXT TEXT,
    HINT_TEXT TEXT,
    NAME  VARCHAR(128),
    DESCRIPTION VARCHAR(256),
    VALIDATE BOOLEAN
)
或者
VARCHAR
SF_INJECT_HINT (
    SQL_TEXT TEXT,
    HINT_TEXT TEXT,
    NAME  VARCHAR(128),
    DESCRIPTION VARCHAR(256),
    VALIDATE BOOLEAN,
    FUZZY BOOLEAN
)
【功能说明】
对指定 SQL 增加 HINT。

【参数说明】:
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);
或者:
SF_INJECT_HINT('SELECT * FROM A;', 'MMT_SIZE(4)', 'TEST_INJECT', 'to test function of injecting hint', TRUE, FALSE);

为以下语句指定 HINT 为 MMT_SIZE = 4 的模糊匹配规则:
SF_INJECT_HINT('SELECT * FROM A;', 'MMT_SIZE(4)', 'TEST_INJECT', 'to test function of injecting hint', TRUE, TRUE);
或者:
SF_INJECT_HINT('SELECT * FROM A;', 'MMT_SIZE(4)', 'TEST_INJECT', 'to test function of injecting hint', TRUE, NULL);

2. SF_DEINJECT_HINT
【定义】:
INT
SF_DEINJECT_HINT (
    NAME VARCHAR(128)
)
【功能说明】:
  对指定 SQL 撤回已增加的 HINT
【参数说明】:
NAME: 要删除的规则名称
【返回值】:
执行成功返回 0,执行失败返回错误码
【举例说明】:
为 SQL 撤回已指定的 HINT:
SF_DEINJECT_HINT('TEST_INJECT');

3. SF_ALTER_HINT
【定义】:
INT
SF_ALTER_HINT (
    NAME VARCHAR(128),
    ATTRIBUTE_NAME  VARCHAR(12),
    ATTRIBUTE_VALUE VARCHAR(256)
)
【功能说明】 :
修改已指定 HINT 的规则属性
【参数说明】:
NAME: 要修改的规则名称
ATTRIBUTE_NAME:要修改的属性名
STATUS:规则是否生效,取值 ENABLED/DISABLED
NAME:规则名称
DESCRIPTION:规则的详细描述
ATTRIBUTE_VALUE:设置的属性值
【返回值】:
执行成功返回 0,执行失败返回错误码
【举例说明】 :
让已指定的 HINT 的规则失效:
SF_ALTER_HINT('TEST_INJECT', 'STATUS', 'DISABLED');

二、测试步骤
1. 创建测试数据
create table test1 as select * from dba_objects where object_type='TABLE';
create table test2 as select * from dba_objects where object_type='TABLE';

 

2. SQL语句绑定执行计划
explain select count(1) from test1 a, test2 b where a.object_id=b.object_id;

2.1 使用object_id关联2张表取count(1),执行计划是HASH INNER JOIN,且是全表扫描

2.2 使用hint 进行嵌套循环链接
explain select /*+ use_nl(a,b) */ count(1) from test1 a, test2 b where a.object_id=b.object_id;
 2.3 使用ENABLE_INJECT_HINT绑定SQL执行计划
1)启用 SQL语句增加HINT
sp_set_para_value(1,'ENABLE_INJECT_HINT',1);

 2)SQL语句绑定HINT
SF_INJECT_HINT(
'select count(1) from test1 a, test2 b where a.object_id=b.object_id;',
'use_nl(a,b)',
'hash_nl_test1_test2',
null,
true,
FALSE
);

2.4 检查SQL语句执行是否启用HINT
SQL> explain select count(1) from test1 a, test2 b where a.object_id=b.object_id; 

3. 通过 SYSINJECTHINT 视图查看已指定的 SQL 语句和对应的 HINT

 4. 删除 HINT
SF_DEINJECT_HINT('hash_nl_test1_test2');

 

达梦在线服务平台:https://eco.dameng.com

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值