暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【干货攻略】DM8 HINT使用小技巧

达梦大学 2020-12-02
1967

本期干货 

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:

查看执行计划


往期推荐

干货攻略|DMSQL程序异常处理

干货攻略|DM8数据库审计

干货攻略|DM8用户管理


文章转载自达梦大学,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论