首批通过分布式安全可靠测评,为关键业务系统打造
其他 Hint
更新时间:2025-03-06 20:47:08
OceanBase 数据库还支持 CURSOR_SHARING_EXACT Hint、MONITOR Hint、PX_JOIN_FILTER Hint、NO_PX_JOIN_FILTER Hint、QB_NAME Hint、READ_CONSISTENCY Hint、QUERY_TIMEOUT Hint、LOG_LEVEL Hint、USE_PLAN_CACHE Hint、TRANS_PARAM Hint、TRACING Hint、STAT Hint、TOPK Hint 和 TRACE_LOG Hint。
CURSOR_SHARING_EXACT Hint
OceanBase 数据库支持使用绑定变量替换 SQL 语句中的字面量,此功能由 CURSOR_SHARING 变量控制,即当cursor_sharing='exact' 时不需要参数化,详细信息请参见 cursor_sharing。
用户可以指定 CURSOR_SHARING_EXACT Hint 来指示优化器关闭此行为。当您指定此 Hint 时,OceanBase 数据库在执行 SQL 语句时不会尝试将字面量替换为绑定变量,从而实现参数改写。
CURSOR_SHARING_EXACT Hint 的语法如下:
/*+ CURSOR_SHARING_EXACT */
CURSOR_SHARING_EXACT Hint 的示例如下:
obclient> CREATE TABLE t(c1 INT PRIMARY KEY,c2 VARCHAR(20));
Query OK, 0 rows affected
obclient> INSERT INTO t VALUES(5,'oceanbase');
Query OK, 1 row affected
obclient> SELECT /*+ CURSOR_SHARING_EXACT*/ * FROM t WHERE c1=5 AND c2 ='oceanbase';
+----------+----------+
| C1 | C2 |
+----------+----------+
| 5 | oceanbase|
+---------------------+
1 row in set
obclient> SELECT query_sql, statement FROM gv$ob_plan_cache_plan_stat; GV$OB_PLAN_CACHE_PLAN_STAT
+---------------------------------------------------------------------------+---------------------------------------------------------------+
| query_sql | statement |
+---------------------------------------------------------------------------+---------------------------------------------------------------+
| SELECT /*+ CURSOR_SHARING_EXACT*/ * FROM t WHERE c1=5 AND c2 ='oceanbase' | SELECT /*+ CURSOR_SHARING_EXACT*/ * FROM t WHERE c1=5 AND c2 ='oceanbase' |
+-------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set
MAX_CONCURRENT Hint
MAX_CONCURRENT Hint 用于指定 SQL 语句的最大并发执行线程数。例如,通过设置为 MAX_CONCURRENT(1),即可指定 SQL 语句以单线程模式执行,这意味着在任何时候,都只有一个线程在处理任务。
MAX_CONCURRENT Hint 的语法如下:
/*+ MAX_CONCURRENT() */
请注意,MAX_CONCURRENT() 中的值可以设置为负数,但是对 SQL 语句的并发控制不生效;推荐设置 MAX_CONCURRENT() 中的值为大于 0 的正整数。
MONITOR Hint
MONITOR Hint 会强制对查询进行实时 SQL 监视,对于非长时间运行的语句也生效。
MONITOR Hint 的语法如下:
/*+ MONITOR */
PX_JOIN_FILTER Hint
PX_JOIN_FILTER Hint 强制优化器使用并行联接位图过滤。
PX_JOIN_FILTER Hint 的语法如下:
/*+ PX_JOIN_FILTER (tablespec) */
NO_PX_JOIN_FILTER Hint
NO_PX_JOIN_FILTER Hint 会阻止优化器使用并行联接位图过滤。
NO_PX_JOIN_FILTER Hint 的语法如下:
/*+ NO_PX_JOIN_FILTER (tablespec) */
QB_NAME Hint
使用 QB_NAME Hint 来定义查询块的名称。可以在外部查询的 Hint 中使用该名称,也可以在内联视图的 Hint 中使用该名称,从而影响在被命名查询块中的对表的查询。
QB_NAME Hint 的语法如下:
/*+ QB_NAME ( queryblock ) */
如果两个或多个查询块具有相同的名称,或者同一个查询块两次被 Hint 指定了不同的名称,那么优化器将忽略所有引用该查询块的名称和 Hint。未使用 QB_NAME Hint 命名的查询块具有由系统生成的唯一名称。这些名称可以显示在计划表中,也可以在查询块中的其他 Hint 中使用。
QB_NAME Hint 的示例如下:
SELECT /*+ QB_NAME(qb) FULL(@qb e) */ employee_id, last_name
FROM employees e
WHERE last_name = 'Smith';
READ_CONSISTENCY Hint
READ_CONSISTENCY Hint 指示服务器去指定某条 SQL 所读取的表模式为弱一致(指定参数
WEAK)或强一致性(指定参数 STRONG)。
READ_CONSISTENCY Hint 的语法如下:
/*+ READ_CONSISTENCY(WEAK[STRONG]) */
READ_CONSISTENCY Hint 的示例如下:
SELECT /*+ READ_CONSISTENCY(WEAK) */ *
FROM employees
WHERE employees.department_id = 1001;
QUERY_TIMEOUT Hint
QUERY_TIMEOUT Hint 指示服务器设定某条 SQL 执行时的超时时间,单位为微秒。
QUERY_TIMEOUT Hint 的语法如下:
/*+ QUERY_TIMEOUT (intnum) */
示例如下,当该查询 1 秒之内未执行完该语句即返回超时错误:
SELECT /*+ QUERY_TIMEOUT(1000000) */ *
FROM employees e
WHERE e.department_id = 1001;
LOG_LEVEL Hint
LOG_LEVEL Hint 指示服务器运行某句 SQL 时采用何种日志级别来执行。
LOG_LEVEL Hint 的语法如下:
/*+ LOG_LEVEL ([']log_level[']) */
以下示例采用 DEBUG 日志级别来执行该 SQL 语句:
SELECT /*+ LOG_LEVEL(DEBUG) */ *
FROM employees e
WHERE e.department_id = 1001;
USE_PLAN_CACHE Hint
USE_PLAN_CACHE Hint 指示服务器执行某条 SQL 时是否要在计划缓存机制下运行,参数 NONE 为不执行计划缓存机制,参数 DEFAULT 表示按照服务器本身的设置来决定是否执行计划缓存机制。
USE_PLAN_CACHE Hint 的语法如下:
/*+ USE_PLAN_CACHE (NONE[DEFAULT]) */
示例如下,以下语句不执行计划缓存机制:
SELECT /*+ USE_PLAN_CACHE(NONE) */ *
FROM employees e
WHERE e.department_id = 1001;
TRANS_PARAM Hint
TRANS_PARAM Hint 指示服务器执行事务时是否要按照参数 param 指定的参数来执行,现在支持的参数只有事务层面的提前解行锁 FORCE_EARLY_LOCK_FREE 参数,FORCE_EARLY_LOCK_FREE 的值为 TRUE 时,表示支持,FALSE 表示不支持。注意这里的参数名和参数值要用单引号(' ')引起来,当参数的值为数值型时可以不用引号引起来。
TRANS_PARAM Hint 的语法如下:
/*+ TRANS_PARAM ['param' , 'param_value'] */
TRANS_PARAM Hint 的示例如下:
SELECT /*+ TRANS_PARAM('FORCE_EARLY_LOCK_FREE' 'TRUE') */ *
FROM employees e
WHERE e.department_id = 1001;
TRACING Hint
TRACING Hint 指示服务器对某些执行计划中的算子采用 TRACING 跟踪。
TRACING Hint 的语法如下:
/*+ TRACING(TRACING_NUM_LIST)*/
TRACING Hint 的示例如下:
SELECT /*+ TRACING(1) */ *
FROM employees e
WHERE e.department_id = 1001;
STAT Hint
STAT Hint 指示对某些执行计划中的算子采用 STAT 显示信息。
STAT Hint 的语法如下:
/*+ STAT(TRACING_NUM_LIST) */
STAT Hint 的示例如下:
SELECT /*+ STAT(1) */ *
FROM employees e
WHERE e.department_id = 1001;
TOPK Hint
TOPK Hint 指示服务器设置模糊查询的精度和最小行数。其中参数 PRECSION 的值为整型,取值范围为 [0,100],表示执行模糊查询时的行数百分比,参数 MINIMUM_ROWS 用来指定最小的返回行数。
TOPK Hint 的语法如下:
/*+ TOPK(PRECISION MINIMUM_ROWS) */
TOPK Hint 的示例如下:
SELECT /*+ TOPK(1,10) */ *
FROM employees e
WHERE e.department_id = 1001;
TRACE_LOG Hint
TRACE_LOG Hint 指示服务器收集跟踪日志(Trace log),收集的跟踪日志(Trace log)在运行 SHOW TRACE 命令时展示。
TRACE_LOG Hint 的语法如下:
/*+ TRACE_LOG */
TRACE_LOG Hint 的示例如下:
SELECT /*+ TRACE_LOG */ *
FROM employees e
WHERE e.department_id = 1001;