Greenplum中的AO表简介
AO表简介
Greenplum数据库可以使用追加优化(append-optimized,AO)的存储格式来批量装载和读取数据,并且能提供HEAP表上的性能优势。 追加优化的存储为数据保护、压缩和行/列方向提供了校验和。行式或者列式追加优化的表都可以被压缩。
堆存储是默认存储模型,并且是PostgreSQL为所有数据库表使用的模型。为频繁进行UPDATE、 DELETE以及单个INSERT操作的表和分区使用堆存储。
GreenPlum的AO表是一种附加优化(append-optimized)的表存储模型,它可以提高数据压缩和查询性能。AO表适用于在表的末尾追加数据,而不是频繁更新或删除现有数据。这样可以减少碎片和重写,并提高I/O效率。AO表还支持分区、索引和约束等功能。
您可以使用CREATE TABLE命令来创建一个AO表,只需在表定义中指定APPENDONLY = TRUE选项即可。例如:
1 | CREATE TABLE ao_table ( id int, name text ) WITH (APPENDONLY = TRUE); |
您还可以指定其他选项,如压缩类型、块大小等,以优化AO表的性能和存储空间。
AO表可以做更新和删除操作,但是这些操作会导致AO表的可见性映射(visibility map)发生变化,需要额外的处理。这可能会增加一些读取和查询的开销。因此,如果您的表需要频繁更新或删除数据,那么AO表可能不是最佳选择。
您应该在以下情况下使用AO表:
- 您的表包含大量的数据,可以按照逻辑分区进行组织。
- 您的表主要用于插入和查询操作,而不是更新和删除操作。
- 您的表可以从压缩技术中受益,以节省存储空间和提高查询性能。
- 您的表不需要支持外键约束或唯一约束。
如果您的表符合这些条件,那么AO表可能是一个合适的选择。
GreenPlum中的AO表是一种支持列存储的表,主要面向OLAP场景。AO表有两种类型:AORO表和AOCO表,分别表示行组织和列组织。
如果您想知道某个表是否是AO表,您可以使用以下SQL语句查询:
1 | SELECT relname, relstorage FROM pg_class WHERE relname = 'your_table_name'; |
其中,relstorage字段表示存储格式,如果是AO表,它的值会是a或c。
示例
您可以使用以下SQL语句创建一个AO表:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | CREATE TABLE aoc_table ( id int, name text, age int ) WITH (appendonly=true, orientation=column); CREATE TABLE aoa_table ( id int, name text, age int ) WITH (appendonly=true); db1=# SELECT relname, relstorage FROM pg_class WHERE relname = 'aoc_table'; relname | relstorage -----------+------------ aoc_table | c (1 row) db1=# SELECT relname, relstorage FROM pg_class WHERE relname = 'aoa_table'; relname | relstorage -----------+------------ aoa_table | a (1 row) db1=# db1=# \d+ aoa_table Append-Only Table "public.aoa_table" Column | Type | Modifiers | Storage | Stats target | Description --------+---------+-----------+----------+--------------+------------- id | integer | | plain | | name | text | | extended | | age | integer | | plain | | Compression Type: None Compression Level: 0 Block Size: 32768 Checksum: t Distributed by: (id) Options: appendonly=true db1=# \d+ aoc_table Append-Only Columnar Table "public.aoc_table" Column | Type | Modifiers | Storage | Stats target | Compression Type | Compression Level | Block Size | Description --------+---------+-----------+----------+--------------+------------------+-------------------+------------+------------- id | integer | | plain | | none | 0 | 32768 | name | text | | extended | | none | 0 | 32768 | age | integer | | plain | | none | 0 | 32768 | Checksum: t Distributed by: (id) Options: appendonly=true, orientation=column |
这个语句会创建一个名为ao_table的AO表,它有三个列:id,name和age。其中,WITH子句指定了表的存储选项,appendonly=true表示启用AO存储,orientation=column表示使用列组织方式。