

本期干货
DM8 HINT使用小技巧
VOL.187 (2020.11.18)
关于HINT
DM 查询优化器采用基于代价的方法。在估计代价时,主要以统计信息或者普遍的数据分布为依据。在大多数情况下,估计的代价都是准确的。但在一些比较特殊的场合,可能会生成很差的执行计划,在这种情况下,用户可以提供一种方法,指示优化器按照固定的方法去选择 SQL 的执行计划。DM 把这种人工干预优化器的方法称为 HINT,它使优化器根据用户的需要来生成指定的执行计划。
Part 01
HINT使用类型
1、SF_INJECT_HINT函数
提供无需修改 SQL 语句但依然能按照指定的 HINT 运行语句的相关功能,使用时有以下限制:
1) INI 参数 ENABLE_INJECT_HINT 需设置为 1;
2) SQL 只能是语法正确的增删改查语句;
3) SQL 会经过系统格式化,格式化之后的 SQL 和指定的规则名称必须全局唯一;
4) HINT 一指定,则全局生效;
5) 系统检查 SQL 匹配时,必须是整条语句完全匹配,不能是语句中子查询匹配;
6) 可通过 SYSINJECTHINT 视图查看已指定的 SQL 语句和对应的 HINT。
2、SQL语句指定HINT
需要在SQL语句中指定HINT,如果 HINT 的语法没有写对或指定的值不正确,DM 并不会报错,而是直接忽略 HINT 继续执行。
Part 02
环境准备
1、构造数据
create table emp as select * from dmhr.employee;
create table dept as select * from dmhr.department;
create index emp_id on emp(department_id);
create index dept_id on dept(department_id);
2、查看执行计划
表的连接方式为 HASH JOIN。

Part 03
HINT使用方法
1、SQL语句中添加HINT
改变表的连接方式为NEST LOOP。

2、SF_INJECT_HINT函数添加HINT
SF_INJECT_HINT函数用法:
SF_INJECT_HINT (
SQL_TEXT TEXT,--要指定 HINT 的 SQL 语句
HINT_TEXT TEXT,--要为 SQL 指定的 HINT
NAME VARCHAR(128),--可以指定名称,或者设为 NULL 让系统自动创建名称
DESCRIPTION VARCHAR(256),--对规则的详细描述,可为 NULL
VALIDATE BOOLEAN--规则是否生效,可为 NULL,则为默认值 TRUE
)
步骤1:
设置参数ENABLE_INJECT_HINT为1
SP_SET_PARA_VALUE(1,'ENABLE_INJECT_HINT',1);
步骤2:
查看参数ENABLE_INJECT_HINT

步骤3:
创建HINT1

步骤4:
查看执行计划

往期推荐
