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

OceanBase管理数据库Optimizer Hint(一)

2023-08-06
253

Hint 机制可以使优化器生成指定的执行计划。

一般情况下,优化器会为用户查询选择最佳的执行计划,不需要用户使用 Hint 指定。但在某些场景下,优化器生成的执行计划可能不满足用户的要求,这时就需要用户使用 Hint 来指定生成某种执行计划。

Hint 语法

Hint 从语法上看是一种特殊的 SQL 注释,所不同的是在注释的左标记后("/*"符号)增加了一个"+"。 既然是注释,如果服务器端无法识别 SQL 语句中的 Hint,优化器会选择忽略用户 Hint 而使用默认的计划生成逻辑结构。另外,Hint 只影响优化器生成计划的逻辑结构,而不影响 SQL 语句的语义。

{ DELETE | INSERT | SELECT | UPDATE | REPLACE } /*+ [hint_text][,hint_text]... */

注意

如果使用 MySQL 的 C 客户端执行带 Hint 的 SQL 语句,需要使用 -c 选项登录,否则 MySQL 客户端会将 Hint 作为注释从用户 SQL 语句中去除,导致系统无法收到用户 Hint。

Hint 参数

Hint 相关参数名称、语义和语法如下表所示。

名称语法语义
NO_REWRITENO_REWRITE禁止 SQL 改写。
READ_CONSISTENCYREAD_CONSISTENCY (WEAK[STRONGFROZEN])读一致性设置(弱/强)。
INDEX_HINT/*+ INDEX(table_name index_name) */设置表索引。
QUERY_TIMEOUTQUERY_TIMEOUT(INTNUM)设置超时时间。
LOG_LEVELLOG_LEVEL([']log_level['])设置日志级别,当设置模块级别语句时候,以第一个单引号(')作为开始,第二个单引号(')作为结束;例如'DEBUG'。
LEADINGLEADING([qb_name] TBL_NAME_LIST)设置联接顺序。
ORDEREDORDERED设置按照 SQL 中的顺序进行联接。
FULLFULL([qb_name] TBL_NAME)设置表访问路径为主表等价于 INDEX(TBL_NAME PRIMARY)
USE_PLAN_CACHEUSE_PLAN_CACHE(NONE[DEFAULT])设置是否使用计划缓存:
  • NONE:表示不使用计划缓存。
  • DEFAULT:表示按照服务器本身的设置来决定是否使用计划缓存。
USE_MERGEUSE_MERGE([qb_name] TBL_NAME_LIST)设置指定表在作为右表时使用 Merge Join。
USE_HASHUSE_HASH([qb_name] TBL_NAME_LIST)设置指定表在作为右表时使用 Hash Join。
NO_USE_HASHNO_USE_HASH([qb_name] TBL_NAME_LIST)设置指定表在作为右表时不使用 Hash Join。
USE_NLUSE_NL([qb_name] TBL_NAME_LIST)设置指定表在作为右表时使用 Nested Loop Join。
USE_BNLUSE_BNL([qb_name] TBL_NAME_LIST)设置指定表在作为右表时使用 Block Nested Loop Join
USE_HASH_AGGREGATIONUSE_HASH_AGGREGATION([qb_name])设置聚合算法为 Hash。例如 Hash Group By 或者 Hash Distinct。
NO_USE_HASH_AGGREGATIONNO_USE_HASH_AGGREGATION([qb_name])设置 Aggregate 方法不使用 Hash Aggregate,使用 Merge Group By 或者 Merge Distinct。
USE_LATE_MATERIALIZATIONUSE_LATE_MATERIALIZATION设置使用晚期物化。
NO_USE_LATE_MATERIALIZATIONNO_USE_LATE_MATERIALIZATION设置不使用晚期物化。
TRACE_LOGTRACE_LOG设置收集 Trace 记录用于 SHOW TRACE 展示。
QB_NAMEQB_NAME( NAME )设置 Query Block 的名称。
PARALLELPARALLEL(INTNUM)设置分布式执行并行度。
TOPKTOPK(PRECISION MINIMUM_ROWS)设置模糊查询的精度和最小行数。 其中 PRECSION 为整型,取值范围[0,100],表示模糊查询的行数百分比;MINIMUM_ROWS 为最小返回行数。

说明

  • QB_NAME 语法是: @NAME
  • TBL_NAME 语法是: [db_name.]relation_name [qb_name]
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论