云数据库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。

注意:SET命令作用在连接级别,只在同一连接内有效,对于新的连接需要重新执行SET,来启用ORCA。

EXPLAIN <SQL text>
SET optimizer = on;
EXPLAIN <SQL text>

在上面的例子中,我们在启用ORCA前后,分别使用EXPLAIN命令来查看查询计划。这样可以检查ORCA是否真正改变了SQL的查询计划。

使用压缩

目前, HybridDB for PostgreSQL的存储支持两种压缩方式:zlib和RLE。

  • RLE适用于数据中的相同值在物理上是连续存储的情况。
  • zlib适用于其他情况。压缩方式可以在字段级别或表级别指定。

详情请参见文档CREATE TABLE

使用其他数字类型

如果查询中包含COUNT(DISTINCT)的唯一值统计操作,建议被统计的字段不要使用字符串类型,也不要使用Numeric类型,尽量采用其他数字类型(例如整型)代替,这样可以将性能提高数倍。