AnalyticDB for PostgreSQL 表设计及性能调优

1、数据库结构定义与设计

Database和Schema的含义

  • Database:是物理结构,是表、索引、视图、存储过程、操作符的集合
  • Schema:是逻辑结构,是对数据库的逻辑划分,一个Database可以有多个Schema

image

例如:

CREATE DATABASE dbname;

CREATE SCHEMA schema_name;

完备的数据类型支持

  • 数值类型:smallint、integer、bigint、decimal、numeric、real、double、serial、bigserial
  • 字符类型:varchar(n)、char(n)、text
  • 时间日期类型:timestamp[无时区]、timestamp[含时区]、interval、date、time[无时区]
  • JSON
  • 几何类型:point、line、lseg、box、path、polygon、circle
  • 其他类型:boolean、money、bit(n)、bytea、array

2、数据表及数据的分布与分区

创建数据表

最简单的例子:

CREATE TABLE tablename (a int, b varchar(15), c date, d double) DISTRIBUTED BY (a);

此语句创建了一个表tablename,分布键为a。

数据表的分布键

ADB for PG支持两种数据分布方式:Hash分布、随机分布。

  • Hash分布(DISTRIBUTED BY (column, ...)):选择一个或多个列作为分布键(distribution key),分布键做Hash算法来确认数据存放到对应的segment节点上,相同分布键值(Hash值相同)会存储到相同的segment上。表上最好有唯一键或者主键,这样能保证数据均衡分布到各个segment上
  • 随机分布(DISTRIBUTED RANDOMLY):无需指定分布键,数据被随机而均匀地分布到各个segment节点上

分布键的定义规则与建议

  • 若未指定分布键,默认表的主键为分布键。若表没有定义主键,则默认将第一列当做分布键
  • 分布键可以被定义为一个或多个列
    例: create table t1(c1 int, c2 int) distributed by (c1,c2);定义了列c1和c2一起作为分布键
  • 分布键的列不能被更新(UPDATE)
  • 主键和唯一键必须包含分布键
    例: create table t1 (c1 int, c2 int, primary key (c1)) distributed by (c2);会报错ERROR: PRIMARY KEY and DISTRIBUTED BY definitions incompatible。由于主键c1不包含分布键c2,所以建表语句返回失败
  • Geometry类型和用户自定义数据类型不能作为分布键
  • 尽量选择数据分布均匀且唯一值(distinct值)较多的列作为分布键
    若选择的分布列数值分布不均匀,则可能导致数据倾斜。某些segment节点存储数据多(查询负载高),根据木桶原理,时间消耗会卡在数据多的节点上。若唯一值少于segment节点数,也会导致数据分布到部分节点上,故不应选择bool类型数据作为分布键
  • 尽量选择经常需要关联(Join)的列作为分布键
    当关联(Join)键和分布键一致时,可以在segment节点内部完成Join,不需要重分布或广播数据。当关联键和分布键不一致时,则需要重分布不一致的表或者广播小表,带来较大的额外开销
  • 尽量选择高并发查询的条件列作为分布键
    高并发简单查询场景选择条件列作为分布键,从而支持做分区裁剪
  • 谨慎选择随机分布(distributed randomly)

数据表的分区

表分区让我们通过把表划分成较小的、更容易管理的小块来支持数据量非常大的表。ADB for PG支持分区裁剪功能,对查询会只扫描所需的数据分区而避免扫描整个表的全部内容,从而提升了查询性能。

以下是一个简单的分区表例子:

数据表的分区键定义规则与建议

查看数据表的分布键和分区信息

ADB for PG

3、数据表的主要属性设计与定义

4、数据库操作介绍

5、查询性能调优

数据倾斜的检查和处理

猜你喜欢

转载自yq.aliyun.com/articles/700617