Hint 是一种 SQL 语句注释,用于将指令传递给 OceanBase 数据库优化器。通过 Hint 可以使优化器生成指定的执行计划。
一般情况下,优化器会为用户查询选择最佳的执行计划,不需要用户使用 Hint 指定,但在某些场景下,优化器生成的执行计划可能无法满足用户的要求,这时就需要用户使用 Hint 来主动指定并生成特殊的执行计划。
—— 摘抄自官网在线体验《常用 Hint 使用》
1. 起手就是三个问题
先通过三个小问题,快速检测一下大家对 Hint 功能的了解程度!
数据库中 Join 操作很常见,例如:
SELECT * FROM t1, t2 WHERE t1.c1 = t2.c1;
问题一:如果我想对 t1 join t2 对应计划中的 join 计算方式进行干预。那么在干预之前,原本 join 方式和顺序的计划空间有几种?
这个问题比较简单,直接公布答案:六种。
- t1 nest loop join t2
- t1 hash join t2
- t1 merge join t2
- t2 nest loop join t1
- t2 hash join t1
- t2 merge join t1
问题二:如果给上面这条 SQL 加了一个 hint:/*+ USE_NL(t1) */,则计划空间会变为几种?分别是什么?
SELECT /*+ USE_NL(t1) */ *
FROM t1, t2 WHERE t1.c1 = t2.c1;
答案:计划空间从上题答案中的 6 种变成了 4 种,是不是猜错了?分别是哪几种先卖个关子,嘿嘿~
问题三:如果我想生成 t2 nest loop join t1 这样的计划(用 NLJ,并且 t2 是左表),应该怎么写这个 Hint?
至于第二个问题为什么是 4 种?具体是哪四种?以及第三个问题的 Hint 怎么写?欢迎大家来学习这期课程,寻求答案。
本期课程会为大家介绍 OceanBase 中最常用的几种 Hint,在学习课程,寻求上述问题答案的过程中,大家就开始能够自己控制 SQL 计划的生产形态了!