greenplum索引介绍

2023-03-06 00:00:00 索引 查询 数据 字段 位图

greenplum索引分类及适用场景
Greenplum数据库数据库支持Postgres索引类型B-树和GiST,不支持Hash和GIN索引。每一种索引类型都使用一种不同的算法,它们适合的查询类型也不同。B-树索引适合于常见的情况并且是默认的索引类型
1.btree索引:
B树索引是现在数据库中常见的索引类型之一,它适用范围比较广:
1.适于拥有重复值较少的字段。数据重复值越少,查询数据选择性越高,使用索引查询数据的效率越高,反之则越低。
2.适用于对字段所在数据有少量修改的场合,例如字段有较少量的插入、修改、删除等情况,更新索引字段键值的代价适中。
3.适用于数据变化相对频繁的OLTP系统
4.需要占用较高的存储空间
5.B-Tree索引主要用于等于和范围查询,特别是当索引列包含操作符" <、<=、=、>=和>"作为查询条件时,Greenplum的查询规划器都会考虑使用B-Tree索引。在使用BETWEEN、IN、IS NULL和IS NOT NULL的查询中,Greenplum也可以使用B-Tree索引。对于基于模式匹配操作符的查询,如LIKE、ILIKE、~和 ~*,仅当模式存在一个常量,且该常量位于模式字符串的开头时,如col LIKE 'foo%'或col ~ ‘^foo’,索引才会生效,否则将会执行全表扫描,如:col LIKE ‘%bar’
创建语法:
默认情况下CREATE INDEX命令将创建B-Tree索引
CREATE INDEX idx_invoice_no ON psa_seller_invoice(invoice_no);
2.bitmap索引:
Greenplum数据库提供位图索引类型。位图索引适合于拥有大量数据、很多临时查询以及少量数据修改(DML)事务的数据仓库应用和决策支持系统。
一个索引提供了指向表中包含一个给定键值的行的指针。常规索引存储了每个键存储了一个元组ID的列表,列表中的元组ID对应于具有那个键值的行。位图索引为每一个键值都存储一个位图。常规索引可能会比表中的数据大几倍,但位图索引提供了和常规索引相同的功能并且只需要被索引数据尺寸的一小部分。
位图中的每一个位对应于一个可能的元组ID。如果该位被设置,则具有相应元组ID的行包含该键值。一个映射函数负责将这个位的位置转换成一个元组ID。位图被压缩存储。如果可区分键值的数量很小,位图索引会小很多同时也会被压缩得更好,并且比常规索引节省可观的空间。一个位图索引的尺寸与该表中行数乘以被索引列中可区分值数量的结果成比例。
位图索引对于在WHERE子句中包含多个条件的查询有效。满足某些但不是全部条件的行在访问表之前就会被过滤掉。这通常会极大地改善响应时间。
何时使用位图索引
位图索引适合用户只查询数据而不更新数据的数据仓库应用。对于拥有100至100,000个可区分值的列并且当被索引列常常与其他被索引列联合查询时,位图索引表现-好。低于100个可区分值的列通常无法从任何类型的索引受益,例如有两个可区分值的性别列(男和女)。而在具有超过100,000个可区分值的列上,位图索引的性能和空间效率会衰退。
位图索引能够提升ad hoc查询的查询性能。在将结果位图转换成元组ID之前,一个查询的WHERE子句中的AND以及OR条件可以通过在位图上直接执行相应的布尔操作快速地解决。如果结果行数很小,查询能够在不做全表扫描的情况下很快地被回答。
何时不用位图索引
不要为唯-一列或者具有高基数数据的列使用位图索引,例如发票号码或者发票代码。位图索引的性能增益和磁盘空间优势在具有100,000或者更多唯-一值的列上开始减小,这与表中的行数无关。
位图索引不适合有大量并发事务修改数据的OLTP应用。
创建语法:
CREATE INDEX idx_seller_tax_no ON psa_seller_invoice USING bitmap(seller_tax_no);
3.GiST索引:
GiST索引非常适合动态数据,并且如果唯-一单词(词素)的数量少于100,000,则速度很快 
创建语法:
CREATE INDEX index_seller_name ON psa_seller_invoice USING gist(seller_name);
4.建立基于函数索引:
B-tree索引的一种,创建基于函数的索引,适用于以下两种情况:
  1.基于对索引键值进行各种函数运算,例如对字符串字段进行大写转换upper()运算。
  2.基于对一个或者多个字段进行各种运算,例如对两个数值字段进行相加运算colA+colB等。
  3.创建基于函数的索引,可以提高在查询条件中对索引使用基于特定函数的效率。因此,一个频繁执行并且需要对特定字段进行特定函数转换的查询语句。但是建立基于函数的索引,无法对使用字段本身或者对字段进行其它函数操作的查询语句起到优化的效果。
创建语法:
create table student(id int,name varchar(100));
create index idx_name on student(upper(name));
5.建立部分索引:
部分索引是建立在一个表的子集上的索引。

索引命名规范
索引以IDX作为前缀标识,不能与表同名。在长度允许的情况下,-好能标识出该索引对应的表名和字段名。
建立索引的名称的原则是简洁和易于理解,索引命名采用如下的规范:
IDX_<简要表名>_<索引首字段名称>

索引使用规范
1.不要把给经常变更的列建索引。全表扫描性能不好时才需要创建索引。
2.不要建重复的索引并给索引命名。
3.低基数的列用bitmap索引。单列的查询使用B-Tree索引。
4.加载数据的时候先drop掉索引,加载之后再重新创建索引。
5.扫描一个大表的子集时,使用部分索引。
6.重创建索引执行执行Analyze。



本文来源:https://blog.csdn.net/weixin_43398232/article/details/107000823

相关文章