Hint 是 SQL 语句中将指令传递给 OceanBase 数据库优化器或服务器的一种注释。通过 Hint 可以使优化器或服务器生成某种特定的计划。 一般情况下,优化器会为用户查询选择最佳的执行计划,不需要用户主动使用 Hint 指定,但在某些场景下,优化器生成的执行计划可能不满足用户的要求,这时就需要用户使用 Hint 来主动指定并生成特殊的执行计划。
Hint 应该少用,仅在您收集了相关表的统计信息并且使用 EXPLAIN PLAN
语句在没有 Hint 的情况下评估了优化器计划之后,才谨慎考虑使用。更改数据库条件以及在后续版本中增强查询性能可能会导致您代码中的 Hint 对性能产生重大影响。
一个语句块只能有一个注释包含 Hint,并且该注释必须跟随 SELECT
、UPDATE
、INSERT
、MERGE
或 DELETE
关键字。
以下是 Hint 在语句块注释中的语法格式:
/*+[hint text]*/
Hint 从语法上看是一种特殊的 SQL 注释, 所不同的是在注释的左标记后增加了一个加号(+)。 如果服务器端无法识别 SQL 语句中的 Hint,那么优化器会选择忽略用户指定的 Hint 而使用默认计划所生成逻辑。另外需要指明的是,Hint 只影响优化器所生成的计划的逻辑,而不影响 SQL 语句的语义。
以下是定义 Hint 时需要注意的一些规则:
DELETE
、INSERT
、MERGE
、SELECT
或 UPDATE
关键字的 Hint 无效。您可以通过在许多 Hint 中定义一个可选的查询块名称,以此来指定该 Hint 适用的查询块。使用此语法,允许您在外部查询中指定一个应用于嵌入式视图的 Hint。
查询块参数的语法格式为 @queryblock
,其中 queryblock
是在查询中被指定的查询块的标识符。queryblock
标识符可以是系统生成的,也可以是用户自己指定的。当您在查询块中直接指定要应用的 Hint 时,将忽略 @queryblock
。
EXPLAIN PLAN
生成,预转换查询块的名称可以通过对使用了 NO_QUERY_TRANSFORMATION
Hint 的查询运行 EXPLAIN PLAN
生成。QB_NAME
来指定用户自定义的名称。许多 Hint 既可以应用于特定的表或索引,也可以更全局地应用于视图中的表或一部分索引的列。语法元素 tablespec
和 indexspec
定义了这些全局 Hint。
以下是 tablespec
的语法:
[ view.[ view. ]... ]table
您必须完全按照在语句中显示的方式来指定要访问的表。如果该语句使用表的别名,则在 Hint 中使用也使用别名而不是表名。但是,即使 Schema 名称出现在语句中,也不要在 Hint 中使用的表名中包含 Schema 名称。
注意
使用 tablespec
子句指定全局 Hint 对于使用 ANSI 连接的查询不起作用,因为优化器在解析期间会生成额外的视图。相反,可以通过 @queryblock
来指定该提示所应用到的查询块。
以下是indexspec
的语法:
{ index
| ( [ table. ]column [ [ table. ]column ]...)
}
在 Hint 的说明部分,当 tablespec
后跟着 indexspec
时,允许但不要求使用逗号来分隔表名和索引名。也允许(但不是必需)使用逗号分隔多次出现的 indexspec
。
备案信息: 粤ICP备15087711号-2
Copyright © 2008-2024 啊嘎哇在线工具箱 All Rights.
本站所有资料来源于网络,版权归原作者所有,仅作学习交流使用,如不慎侵犯了您的权利,请联系我们。