如何在Greenplum中创建联合索引

昨天有朋友问到【Greenplum是否支持多列联合索引】这个问题,答案当然是支持的,在这里做一下简单的阐述,方便有问题的朋友查阅。

说几句废话

首先,Greenplum中是不建议大量采用索引的。因为Greenplum是通过大规模并行查询的方式来遍历数据,所以复杂查询会大量采用全表扫描的形式,通过采用表合理的表分区会将数据集缩小。另外基于数据分析系统的特点,会从别的系统大量、频繁的迁入数据,如果采用索引,会降低数据入库的速度。另外分析型查询通常返回大量的结果,使用索引的效果有时候并不是特别明显。但是也并不是绝对一个索引都不能有,针对那种变化比例特别小的表,可以长期持有索引;变化大的表可以在大批量装载数据之前将索引删掉,装载完数据后再重建索引。

其次,Greenplum支持Postgres的索引类型:B-tree, GiST, SP-GiST和GIN,不支持哈希索引。Greenplum还提供了适用于数据仓库和决策支持类系统的Bitmap索引。具体索引的定义和用法可以自行百度啦。

如何创建联合索引

首先可以通过官方手册中创建索引的语法看一下索引创建的大体结构。


一般我们创建索引直接采用最简单的语法:CREATE INDEX index_name on table_name (column_name)即可。此时默认创建的是B-tree索引。如下:

postgres=# create index idx_t1 on t1 (id);
CREATE INDEX
postgres=# \d+ t1
                  Table "public.t1"
 Column |  Type   | Modifiers | Storage | Description
--------+---------+-----------+---------+-------------
 id     | numeric |           | main    |
 pid    | numeric |           | main    |
Indexes:
    "idx_t1" btree (id)
Has OIDs: no
Distributed by: (id)

如果要创建多列联合索引,只需要将多个索引列放到括号内用逗号分隔即可,下面掩饰一个Bitmap索引。

postgres=# create index idx_bm_union on t1 using bitmap(id,pid);
CREATE INDEX
postgres=# \d+ t1
                  Table "public.t1"
 Column |  Type   | Modifiers | Storage | Description
--------+---------+-----------+---------+-------------
 id     | numeric |           | main    |
 pid    | numeric |           | main    |
Indexes:
    "idx_bm_union" bitmap (id, pid)
    "idx_t1" btree (id)
Has OIDs: no
Distributed by: (id)

简单分享到此结束,希望对各位有帮助,我是阿福~

关注微信公众号

VMware 中国研发中心

Greenplum官方技术交流群

扫码添加小助手即可入群,添加时请备注 “GP网站”