随着数据仓库中数据的不断累加,某些查询的效率变得越来越慢,除了对查询的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 );