返回首页

gbase数据、南大通用产品文档:GBase8cSQL 查询最佳实践

更新日期:2024年09月11日

根据数据库的SQL 执行机制以及大量的实践总结发现:
通过一定的规则调整SQL 语句,
在保证结果正确的基础上,能够提高SQL 执行效率。

使用union all 代替union
union 在合并两个集合时会执行去重操作,而union all 则直接将两个结果集合并、不执
行去重。执行去重会消耗大量的时间,因此,在一些实际应用场景中,如果通过业务逻
辑已确认两个集合不存在重叠,可用union all 替代union 以便提升性能。

join 列增加非空过滤条件
若join 列上的NULL 值较多,
则可以加上is not null 过滤条件,
以实现数据的提前过滤,
提高join 效率。

not in 转not exists
not in 语句需要使用nestloop anti join 来实现,而not exists 则可以通过hash anti join 来
实现。在join 列不存在null 值的情况下,not exists 和not in 等价。因此在确保没有null
值时,可以通过将not in 转换为not exists,通过生成hash join 来提升查询效率。
如下所示,
如果t2.d2 字段中没有null 值(t2.d2 字段在表定义中not null)查询可以修改为
select * from t1 where not exists(select * from t2 where t1.c1 = t2.c1);
产生的计划如下:
postgres=# explain select * from t1 where not exists(select * from t2 where t1.c1 = t2.c1);
QUERY PLAN
------------------------------------------------------------------
Hash Anti Join (cost=58.35..107.44 rows=1074 width=8) Hash Cond: (t1.c1 = t2.c1)
-> Seq Scan on t1 (cost=0.00..31.49 rows=2149 width=8)
-> Hash (cost=31.49..31.49 rows=2149 width=4)
-> Seq Scan on t2 (cost=0.00..31.49 rows=2149 width=4) (5 rows)

选择hashagg。
查询中GROUP BY 语句如果生成了groupagg+sort 的plan 性能会比较差,
可以通过加大
work_mem 的方法生成hashagg 的plan,因为不用排序而提高性能。

尝试将函数替换为case 语句。
函数调用性能较低,
如果出现过多的函数调用导致性能下降很多,
可以根据情况把可下
推函数的函数改成CASE 表达式。

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

避免对索引使用函数或表达式运算。

对索引使用函数或表达式运算会停止使用索引转而执行全表扫描。

尽量避免在where 子句中使用!=或<>操作符、null 值判断、or 连接、参数隐式转换。

对复杂SQL 语句进行拆分。
对于过于复杂并且不易通过以上方法调整性能的SQL 可以考虑拆分的方法,
把SQL 中
某一部分拆分成独立的SQL 并把执行结果存入临时表,
拆分常见的场景包括但不限于:

作业中多个SQL 有同样的子查询,并且子查询数据量较大。

Plan cost 计算不准,导致子查询hash bucket 太小,比如实际数据1000W

行,hash bucket 只有1000。

函数(如substr,to_number)导致大数据量子查询选择度计算不准。

多DN 环境下对大表做broadcast 的子查询。其他更多调优点,请参考14.4.6 典型
SQL 调优点。
6
应用程序开发教程

问题现象
需要加载不符合规范时间格式,
如2018-03-16 10:51:23.1234560,
微秒后面多了个
0。
create table t_time(c1 datetime);
# cat time.txt
2018-03-16 10:51:23.1234560
解决方法
通过设置datetime format '%Y-%m-%d %H:%i:%s.%f0'截断数据文件中的0。
gbase> load data infile 'sftp://gbase:gbase@192.168.105.120//home/gbase/ti
me.txt' into table t_time
datetime format '%Y-%m-%d %H:%i:%s.%f0
';
Query OK, 1 row affected (Elapsed: 00:00:00.78)
Task 18 finished, Loaded 1 records, Skipped 0 records

GBase 8a MPP Cluster 最佳实践
5 FAQ
文档版本(2022-02-11)
南大通用数据技术股份有限公司
124
gbase> select * from t_time;
+----------------------------+
| c1
|
+----------------------------+
| 2018-03-16 10:51:23.123456 |
+----------------------------+
1 row in set (Elapsed: 00:00:00.00)

+-------------+
1 row in set
示例5:取模的三种表现形式。
gbase> SELECT 253 % 7, MOD(253,7), 253 MOD 7 FROM dual;
+---------+------------+-----------+
| 253 % 7 | MOD(253,7) | 253 MOD 7 |
+---------+------------+-----------+
|
1 |
1 |
1 |
+---------+------------+-----------+
1 row in set