云数据库 HybridDB for PostgreSQL 是一种在线分布式云数据库,它基于 Greenplum Database 开源数据库项目开发,经阿里云深度扩展,由多个
计算组 组成,提供大规模并行处理(MPP)数据仓库服务。
本文介绍在不同操作场景下使用云数据库 HybridDB for PostgreSQL 时的一些具体建议。选择合适的操作实践将有效地帮助您提高 HybridDB for PostgreSQL 的性能、减少存储成本等。
使用列存加压缩
对于更新不频繁、字段较多的表,如果想提高性能、提高导入速度或者降低成本,建议使用列存加压缩。这样在保证性能的基础上,压缩比率一般可以达到 3 倍以上,而且通常导入速度更快。
例如,在建表语句中加入子句 WITH (APPENDONLY=true, ORIENTATION=column, COMPRESSTYPE=zlib, COMPRESSLEVEL=3, BLOCKSIZE=1048576),即可创建列存压缩表。
具体语法参见文档
CREATE TABLE。
启用 Nested Loop
在实例缺省状态下,HybridDB for PostgreSQL 没有启用 Nested Loop(嵌套连接)。对于只涉及或返回少部分数据的查询,性能可能不是最优的。
例如下面的 SQL 语句:
select * from T1 join T2 on T1.c1 = T2.c1 where T1.c2 >= '230769548' and T1.c2 < '230769549' limit 100;
其特点是 T1 和 T2 表都比较大,T1 上的选择条件(T1.c2 >= '230769548' and T1.c2 < '23432442')过滤了绝大多数数据记录,且有 LIMIT 子句,所以查询实际上只涉及总数据量中的一小部分。这种情况下,使用 Nested Loop 的连接方式是最优的。
要使用 Nested Loop 连接,需要执行一下 SET 命令,如下所示:
```
show enable_nestloop ;
enable_nestloop
-----------------
off
SET enable_nestloop = on ;
show enable_nestloop ;
enable_nestloop
-----------------
on
explain select * from T1 join T2 on T1.c1 = T2.c1 where T1.c2 >= '230769548' and T1.c2 < '23432442' limit 100;
QUERY PLAN
-----------------------------------------------------------------------------------------------
Limit (cost=0.26..16.31 rows=1 width=18608)
-> Nested Loop (cost=0.26..16.31 rows=1 width=18608)
-> Index Scan using T1 on c2 (cost=0.12..8.14 rows=1 width=12026)
Filter: ((c2 >= '230769548'::bpchar) AND (c2 < '230769549'::bpchar))
-> Index Scan using T2 on c1 (cost=0.14..8.15 rows=1 width=6582)
Index Cond: ((c1)::text = (T1.c1)::text)
```
可以发现,T1 和 T2 两张表是使用 Nested Loop 连接的,从而获得了最优的性能。
使用 ORCA 优化器
HybridDB for PostgreSQL 支持 ORCA 优化器。当执行一个较复杂的 SQL,并且发现性能不理想时,可以试试启用 ORCA 优化器进行优化。在数据库连接中,执行如下 SET 命令,即可启用 ORCA。
[backcolor=transparent]注意:SET 命令作用在连接级别,只在同一连接内有效,对于新的连接需要重新执行 SET,来启用 ORCA。
EXPLAIN <SQL text>
SET optimizer = on;
EXPLAIN <SQL text>
在上面的例子中,我们在启用 ORCA 前后,分别使用 EXPLAIN 命令来查看查询计划。这样可以检查 ORCA 是否真正改变了 SQL 的查询计划。
使用压缩
目前, HybridDB for PostgreSQL 的存储支持两种压缩方式:zlib 和 RLE。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。