GBase 8a支持hint来临时调整SQL执行计划,其中session级的参数全部可以通过hint来设置,本文还整理一些特殊hint。
目录导航
语法
/*+HINT[,HIND]*/
多个hint可以用逗号分隔,也可以分开写多个,比如
/*+HINT*/ /*+HINT*/
混合用也是可以的。
注意:
由于hint采用的是和注释相同的格式,所以如果在命令行客户端 gccli执行时,要注意加上-c 参数,避免/* */之间的【注释】部分被自动忽略掉,而没有发送到服务器执行。
HINT数据库参数
参数:_gbase_hint_error_level
参数含义:
- 0 忽略错误, 默认值
- 1 显示警告warning
- 2 报错ERROR
当单一 select 语句含有多个 hint,错误之前的 hint 部分能正确执行,错误之后的 hint 不再执行,并且不影响后面 select 中hint 的执行。
SESSION参数hint
一些数据库参数,可以通过set 命令进行设置,默认只对当前连接有效。而set命令毕竟是一个SQL,而且set完后还要记得恢复,避免对后续的当前连接的其它SQL有影响,于是通过hint方式成为一个优选方案。
如下是5行的数据表,我们通过HINT指定做多处理4行:/*+_gbase_result_threshold(4)*/,执行结果为报错 Too many tuples
gbase> select * from t2;
+-------------+
| id |
+-------------+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
+-------------+
5 rows in set (Elapsed: 00:00:00.00)
gbase> select /*+_gbase_result_threshold(4)*/ * from t2;
+-------------+
| id |
+-------------+
+-------------+
ERROR 1708 (HY000): [2001::210:5050](GBA-02AD-0005)Failed to query in gnode:
DETAIL: (GBA-01EX-0006) Express out of resources error:Too many tuples.
SQL: SELECT /*2001::210_1837_4_2022-03-28_10:22:39*/ /*+ TID('148809') */ /*+ local _gbase_result_threshold(4) */ `testdb.t2`.`id` AS `id` FROM `testdb`.`t2_n1` `testdb.t2`
0 rows in set (Elapsed: 00:00:00.01)
多个hint
用逗号分隔
适合成组一起使用的情况
gbase> select /*+_gbase_result_threshold(5),gbase_parallel_degree(1)*/ * from t2;
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
+------+
5 rows in set (Elapsed: 00:00:00.00)
各自独立
适合多个策略分别控制的情况。
gbase> select /*+_gbase_result_threshold(5)*/ /*+gbase_parallel_degree(1)*/ * from t2;
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
+------+
5 rows in set (Elapsed: 00:00:00.00)
查询哪些变量支持 hint
从元数据表,查询满足session_level=1以及writeable=1的参数都可以session设置。
select variable_name
from information_schema.session_variables
where session_level=1 and writeable=1
特殊HINT
如下是GBase 8a自带的一些特殊hint的说明
first_rows
请参考 GBase 8a 通过first_rows的hint提高带limit的简单查询性能
priority
在旧的资源管理功能中使用,传入此值,调整资源使用优先级。
distribute_exec
忽略集群层执行计划,直接下发到各个节点并行执行,比如用于库内排序
insert into TABLEA select /*+distribute_exec*/ from TABLEB order by id
HINT错误测试
参数_gbase_hint_error_level=1
输出warning,Unknown system variable XXX
gbase> set _gbase_hint_error_level=1;
Query OK, 0 rows affected (Elapsed: 00:00:00.00)
gbase> select /*+ABC(3)*/ * from t2;
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
+------+
5 rows in set, 1 warning (Elapsed: 00:00:00.00)
gbase> show warnings;
+-------+------+--------------------------------------------------+
| Level | Code | Message |
+-------+------+--------------------------------------------------+
| Note | 1105 | Parse hint failed: Unknown system variable 'ABC' |
+-------+------+--------------------------------------------------+
1 row in set (Elapsed: 00:00:00.00)
参数_gbase_hint_error_level=2
错误的hint直接报错:ERROR 1805 (HY000): Got error in hint. Parse hint failed: Unknown system variable
gbase> set _gbase_hint_error_level=2;
Query OK, 0 rows affected (Elapsed: 00:00:00.00)
gbase> select /*+ABC(3)*/ * from t2;
ERROR 1805 (HY000): Got error in hint. Parse hint failed: Unknown system variable 'ABC'
gbase>