返回首页

gbase数据、南大通用产品文档:GBase8c

更新日期:2024年09月11日

优化器GUC 参数的Hint
功能描述
设置本次查询执行内生效的查询优化相关GUC 参数。hint 的推荐使用场景可以参考各
guc 参数的说明,此处不作赘述。
语法格式
set(param value)
参数说明

param 表示参数名。

value 表示参数的取值。

目前支持使用Hint 设置生效的参数有

布尔类:
enable_bitmapscan

enable_hashagg

enable_hashjoin

enable_indexscan

enable_indexonlyscan

enable_material

enable_mergejoin

enable_nestloop

enable_index_nestloop、enable_seqscan、enable_sort、enable_tidscan

整形类:
query_dop

浮点类:
cost_weight_index、
default_limit_rows、
seq_page_cost、
random_page_cost、
cpu_tuple_cost、
cpu_index_tuple_cost、cpu_operator_cost、effective_cache_size

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
577

枚举类型:
try_vector_engine_strategy

设置不在白名单中的参数,
参数取值不合法,
或hint 语法错误时,
不会影响查询执
行的正确性。使用explain(verbose on)执行可以看到hint 解析错误的报错提示。

GUC 参数的hint 只在最外层查询生效——子查询内的GUC 参数hint 不生效。

视图定义内的GUC 参数hint 不生效。

CREATE TABLE … AS … 查询最外层的GUC 参数hint 可以生效。

下列类型的 SELECT 语句不会触发 Select 触发器上的任何操作。

触发列不在投影列表中
(例如,
出现在 SELECT 语句的 WHERE 子句中的列不会
执行 Select 触发器)。

引用远程表的 SELECT 语句。

SELECT 语句调用聚集函数或 OLAP 窗口聚集函数。

SELECT 语句包含集合运算符或
(UNION 、
UNION ALL 、
INTERSECT 、
MINUS
或 EXCEPT)。

SELECT 语句包含 DISTINCT 或 UNIQUE 关键字。

包含 SELECT 语句的 UDR 表达式不在投影列表中。

SELECT 语句出现在 INSERT INTO 语句中。

SELECT 语句出现在滚动游标中。

触发器是级联 Select 触发器。
级联 Select 触发器是其操作包含 SPL 例程的触发器,该例程本身具有触发 select
语句。但是,不执行级联 Select 触发器的操作,数据库服务器也不返回错误。


GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司 - 341 -

+------------+-------------------------+
2 rows in set (Elapsed: 00:00:00.47)
注意
如果用户在GROUP BY 部分省略的列在分组中不是唯一的,请不要
使用这个特性,否则将得到不可预知的结果。
GROUP BY 优化
使用hint 优化GROUP BY:

GBase 8a MPP Cluster 产品手册
5 数据库管理指南
文档版本953(2022-09-15)
南大通用数据技术股份有限公司
868
create table users(u_id int,u_name char(10),birthday datetime,address
varchar(10));
create table products(p_id int,p_name char(10),price float,stocks int);
create table orders(o_id int,u_id int,p_id int,amount int);
insert into users values (0,'zhao','1990-12-29 12:00:00','中国.吉林.长春');
insert into users values (1,'qian','1990-12-29 12:00:00','中国.北京');
insert into users values (2,'sun','1990-12-29 12:00:00','中国.上海');
insert into users values (3,'li','1990-12-29 12:00:00','中国.天津');
insert into users values (4,'zhou','1990-12-29 12:00:00','中国.湖北.武汉');
insert into users values (5,'wu','1990-12-29 12:00:00','中国.湖南.长沙');
insert into users values (6,'zheng','1990-12-29 12:00:00','中国.河北.沧州');
insert into users values (7,'wang','1990-12-29 12:00:00','中国.辽宁.沈阳');
insert into users values (8,'zhao','1990-12-29 12:00:00','中国.云南.昆明');
insert into users values (9,'li','1990-12-29 12:00:00','中国.西藏.拉萨');
insert into orders values (600001,1,100010,2500);
insert into orders values (600002,3,100008,3500);
insert into orders values (600003,4,100009,500);
insert into orders values (600004,5,100007,5000);
insert into orders values (600005,9,100003,2510);
insert into orders values (600006,0,100004,10500);
insert into orders values (600007,3,100002,5500);
insert into orders values (600008,3,100001,6000);
insert into orders values (600009,4,100009,2100);
insert into orders values (600010,5,100001,1300);
insert into orders values (600011,6,100007,8900);
insert into orders values (600012,9,100008,2900);
insert into orders values (600013,2,100009,6900);
insert into orders values (600014,1,100002,3600);
insert into orders values (600015,1,100003,1500);
SELECT /*+ first_groupby */ distinct `users`.u_name , sum(orders.amount)
FROM
users,
orders
WHERE
users.u_id
=
orders.u_id
GROUP BY
`users`.u_name ORDER BY
`users`.u_name limit 3;
上面的sql 会先在orders 表上做group by 之后再去join users。