随着数据仓库中数据的不断累加,某些查询的效率变得越来越慢,除了对查询的SQL需要优化,对查询的基表进行拆分(分区表),对某些常用查询字段加索引已经变得很需要了。

3.3.6版本Greenplum中索引的语法是这样的:

CREATE [UNIQUE] INDEX [CONCURRENTLY] name ON table
[USING method]
( {column | (expression)} [opclass] [, ...] )
[ WITH ( FILLFACTOR = value ) ]
[TABLESPACE tablespace]
[WHERE predicate]

这里有几点需要关注的是:

1.GP中的索引也支持函数类,比如在字段col上建立索引upper(col),则检索时如:where upper(col) = 'JIM' 时也将使用该索引;

2.GP支持的索引方式有B-tree, bitmap, hash, GiST, and GIN,其中Btree是最常见的,R-tree索引将不再GP的后续版本中使用(以前的版本仍然有),用户假如在创建索引时指定它将会被GIST代替,用户也可自己定义一类索引;

3.UNIQUE索引被使用时需要注意该索引的字段必须是GP仓库的分布字段(或类似),UNIQUE索引也是Btree索引;

4.使用is null条件时,索引默认是不起作用的,这种情况时需要先在建索引时指定is null作为条件

5.与postgresql不同,GREENPLUM不支持CONCURRENTLY选项

几个索引的例子:

1.UNIQUE

CREATE UNIQUE INDEX title_idx ON films (title);

2.位图索引(bitmap)

CREATE INDEX gender_bmp_idx ON employee USING bitmap (gender);

3.函数索引

CREATE INDEX lower_title_idx ON films ((lower(title)));

4.fillfactor

CREATE UNIQUE INDEX title_idx ON films (title) WITH (fillfactor = 70); -----fillfactor一般是默认90,假如是静态表,则可以用100,update更新比较频繁时则选小一点的值,选值范围是10-100;

5.指定tablespace

CREATE INDEX code_idx ON films(code) TABLESPACE indexspace;

其他

删除索引:drop index index_name;

更改索引:

ALTER INDEX name RENAME TO new_name;
ALTER INDEX name SET TABLESPACE tablespace_name;
ALTER INDEX name SET ( FILLFACTOR = value );
ALTER INDEX name RESET ( FILLFACTOR );