南大通用GBase 8a 用户可使用的hint整理

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>