GreenPlum--索引详解
索引的使⽤:
1、在分布式数据库中如GP中,应保守使⽤索引。
解释:
1)OLTP系统中,⽐如Oracle会⼤量使⽤索引,因为在事物不断变化的系统中,使⽤索引可以有效提⾼查询和修改的性能。
2)OLAP系统中,累积了⼤量的历史数据,⽽且修改和删除的操作会⽐OLTP系统少很多。
3)分布式数据库中,对顺序读取的性能是⾮常⾼的,⽽索引本质上是个随机寻址操作,这不适合分布式数据库。
4)对于GP⽽⾔,数据已经分布到各个segment上,在加上分区,扫描的范围就更⼩。
5)索引的⽬的是帮助我们到想要的数据,综合3)4)完全可以说是应该更保守使⽤索引。
2、在返回⼀定量结果的情况下(量⽐较⼩),索引同样可以有效改善压缩AO表上的查询性能
3、GP会⾃动给为主键建⽴主键索引。
主表建⽴索引,默认给⼦表分区表也会创建索引。在分区表中,修改主表分区名,⼦表分区名也会跟着修改,但是索引不会这样,主表索引修改后,需要⼿动修改⼦表索引。
4、需确保索引的创建在查询⼯作负载中真正被使⽤到。
创建索引需要考虑的问题
查询⼯作负载
AO表:查询AO表是需要对其先进⾏解压,使⽤索引的话,就会只解压索引范围内的数据。
避免在频繁更新的列上使⽤索引
创建选择性B-tree索引(⾼于0.8)(distinct 值)
低选择性列上使⽤位图索引
索引列⽤于关联
索引列经常⽤在查询条件中
⼀、索引的类型:
PostgreSQL提供了多种索引类型:B-Tree、Hash、GiST和GIN,由于它们使⽤了不同的算法,因此每种索引类型都有其适合的查询类型。缺省时,CREATE I NDEX命令将创建B-Tree索引。
GP中常⽤的是:B-Tree和Bitmap索引。
PostgreSQL中没有Bitmap索引,⽽GP中删除了Hash索引。
GP中使⽤唯⼀索引时必须包含DK,唯⼀索引不⽀持AO表。
解释:⼀般AO表是分区表,唯⼀索引只能在某个分区表中唯⼀,⽽不能对这张表都唯⼀。
1. B-Tree:平衡树
通过树形结构将所有数据组织,然后开枝散叶分布在每⼀个枝叶上,通过⼆分法算法进⾏扫描数据,存储的结构是列的role_id,id值,键值,随着数据表的数据增多,索引线性增多。
在关系型数据库中⽤的⾮常多,因为在这类数据库中多使⽤第三范式的数据结构创建,为了尽量减少数据的冗余,就造成数据的选择性⽐较⾼。
CREATE TABLE test1 (
id integer,
content varchar
);
CREATE INDEX test1_id_index ON test1 (id);
B-Tree索引主要⽤于等于和范围查询,特别是当索引列包含操作符" <、<=、=、>=和>"作为查询条件时,PostgreSQL的查询规划器都会考虑使⽤B-Tree索引。在使⽤BETWEEN、IN、IS NULL和IS NOT NULL的查询中,PostgreSQL也可以使⽤B-Tree索引。然⽽对于基于模式匹配操作符的查询,如LIKE、ILIKE、~和~*,仅当模式存在⼀个常量,且该常量位于模式字符串的开头时,如col LIKE 'foo%'或col ~ '^foo',索引才会⽣效,否则将会执⾏全表扫描,如:col LIKE '%bar '。
2.位图索引(适⽤重复值较多)
适合于数据仓库应⽤;
每个位图对应⼀组数据表中相同值⾏的ID记录;
Bitmap索引空间占⽤⼩;
位图的每⼀位对应源数据的标识符,被设置的位对应的记录包含该位图相同的值;
创建速度快;
允许键值为空;(B-tree不允许)⽐如where 条件判断 is null B-tree 就不会⾛索引,⽽位图仍旧会⾛索引
表记录的⾼效访问;
使⽤条件:
·何时使⽤位图索引:
Bitmap索引在DISTINCT值数量在100和100000之间时可以有较好的表现;
在特征合适的列上使⽤Bitmap索引好于B-tree索引;
位图索引在分析查询⽅⾯性能较好
·何时不宜使⽤位图索引
位图索引不适合⽤于唯⼀性列和DISTINCT值很⾼的列;
位图索引不合适⼤量并发事务更新数据的OLTP类型应⽤。
3.创建索引
使⽤CREATE INDEX在表中定义索引,缺省创建B-tree索引。
例如:
CREATE INDEX idx_01 ON tb_cp_02(id);
创建位图索引:
CREATE INDEX bmidx_01 ON tb_cp_02 USING BITMAP(date);
\h create index
检查索引使⽤:
通过EXPLAIN命令来检查查询是否使⽤了索引,在输出结果中查下⾯的查询节点以确认索引的使⽤ Index Scan -扫描索引Bitmap Heap Scan
-从BitmapAnd,BitmapOr或BitmapIndexScan和数据⽂件⽣成的记录所产⽣的Bitmap中检索数据 Bitmap Index Scan --从索引底层扫描那些与查询相匹配的位图索引 BitmapAnd or BitmapOr
–将来⾃多个位图索引扫描的节点进⾏And或Or连接,⽣成⼀个新的位图作为输出
分析:
为什么会出现Bitmap Heap Scan⽽不是简单的Bitmap Scan呢?
我们可能对表中多个字段创建位图索引,当对表中数据进⾏where条件过滤是使⽤了这多个字段,就会出现Bitmap Heap Scan
备注:在GP中默认是不使⽤索引扫描的,默认是顺序扫描
show enable_seqscan;
关闭默认扫描⽅式:
set enable_seqscan=off;
检查索引的使⽤:
greenplum数据库很难通过⼀个通⽤的程序来确定哪些场景要使⽤索引,⼤量的测试是必要的:
在创建和更新索引后进⾏ANALYZE 使⽤真实数据测试
使⽤很⼩的数据量来测试是致命的错误
当索引没有被使⽤,必要情况下可以强制使⽤
重建索引:
重建索引将使⽤存储在索引表中的数据建⽴新的索引取代旧的索引;
更新和删除操作不更新位图索引
重建全部索引:REINDEX TABLE tb_cp_02;
重建特定索引:REINDEX INDEX bmidx_01;
删除索引
在装载数据时,通常先删除索引,再重建索引使⽤DROP INDEX命令删除特定索引(效率问题),例如:DROP INDEX bmidx_01;
⽇常重建索引
对于B-tree索引,新重建的所有⽐存在较多更新的索引更快
重建索引可以回收过期的空间
在GP中,删除索引然后创建通常⽐REINDEX更快
当更新索引列时,Bitmap索引不会被更新,需要⼿⼯的REINDEX

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。