达梦HINT用法总结

达梦统计信息提示

HINT 的常见格式如下所示:
SELECT /+ HINT1 [HINT2]/ 列名 FROM 表名 WHERE_CLAUSE ;
UPDATE 表名 /+ HINT1 [HINT2]/ SET 列名 =变量 WHERE_CLAUSE ;
DELETE FROM 表名 /+ HINT1 [HINT2]/ WHERE_CLAUSE ;
需要注意的是:如果 HINT 的语法没有写对或指定的值不正确,DM 并不会报错,而是直接忽略 HINT 继续执行。

一、INI参数提示:通过 V$HINT_INI_INFO查询支持HINT的INI参数
用法举例:SELECT /+ENABLE_HASH_JOIN(1)/ * FROM T1,T2 WHERE C1=D1;

二、索引提示:
使用索引:
表名 + INDEX + 索引名

/*+ INDEX (表名[,] 索引名) {INDEX (表名[,] 索引名)} /
不使用索引:
/
+ NO_INDEX (表名[,] 索引名) { NO_INDEX (表名[,] 索引名)} */

三、连接方法提示:
USE_HASH
强制两个表间使用指定顺序的哈希连接,例如:SELECT /+ USE_HASH(T1, T2) / * FROM …
NO_USE_HASH
强制两个表间不能使用指定顺序的哈希连接,例如:SELECT /
+ NO_USE_HASH(T1, T2) / * FROM …
USE_NL(NO_USE_NL)
强制两个表间使用嵌套循环连接,例如:SELECT /
+ USE_NL(a, b) / * FROM …
USE_NL_WITH_INDEX(NO_USE_NL_WITH_INDEX)
当连接情况为左表+右表索引时,强制两个表间使用索引连接,例如:SELECT /
+ USE_NL_WITH_INDEX(T1, IDX_T2_ID) / * FROM …
USE_MERGE(NO_USE_MERGE)
强制两个表间使用归并连接。归并连接所用的两个列都必须是索引列。例如:SELECT /
+ USE_MERGE(T1,T2) / * FROM …
SEMI_GEN_CROSS(NO_SEMI_GEN_CROSS)
优先采用半连接转换为等价的内连接,仅 OPTIMIZER_MODE=1 有效。例如:SELECT /
+ SEMI_GEN_CROSS OPTIMIZER_MODE(1) / COUNT() FROM …
USE_CVT_VAR( NO_USE_CVT_VAR)
优先采用变量改写方式实现连接,适合驱动表数据量少而另一侧计划较复杂的场景,仅OPTIMIZER_MODE=1 有效。例如:SELECT /
+ USE_CVT_VAR OPTIMIZER_MODE(1) / COUNT() FROM …
ENHANCED_MERGE_JOIN
一般情况下,归并连接需要左右孩子的数据按照连接列有序,使用此优化器提示时,优化器将考虑通过插入排序操作符的方式实现归并连接,仅 OPTIMIZER_MODE=1 有效。例如:SELECT /*+ stat(T1 1M) stat(T2 1M) /COUNT() FROM …

四、连接顺序提示
多表连接时优化器会考虑各种可能的排列组合顺序。使用 ORDER HINT 指定连接顺序提示可以缩小优化器试探的排列空间,进而得到接近 DBA 所期望的查询计划。如果连接顺序和连接方法提示同时指定且二者间存在自相矛盾,优化器会以连接顺序提示为准。
ORDER HINT
语法:/*+ ORDER (T1, T2 , T3, … tn ) */

五、统计信息提示
优化器在计划优化阶段会自动获取基表的行数。但是一些特殊类型的表行数估算并不准确,或者 DBA 希望了解表大小对计划影响的时候,需要手动设置表的行数。
语法:/*+ STAT (表名, 行数) */
统计信息提示只能针对基表设置,视图和派生表等对象设置无效。如果表对象存在别名则必须使用别名。行数只能使用整数,或者整数+K(千),整数+M(百万),整数+G(十亿)。行数提示设置后,统计信息的其它内容也会做相应的调整。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值