【實戰系列】如何在 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 數據平臺的落地。


分享到:


相關文章: