【实战系列】如何在 Greenplum 中创建联合索引

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

说几句废话

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

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

如何创建联合索引

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

【实战系列】如何在 Greenplum 中创建联合索引

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

<code>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)/<code>

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

<code>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)/<code>



阿福:

社区活跃志愿者,山东辉鸿泛在电子科技技术总监。丰富的数据库开发运维经验。主导并完成了多个基于 Greenplum 数据平台的落地。


分享到:


相關文章: