返回首页

gbase数据、南大通用产品文档:GBase8aHash 索引的选择

更新日期:2024年09月11日

Hash Index 通常可以用来提升等值查询的定位效率,
特别是对以单表精确查询为主
的应用场景尤为适合。如电信业务中的并发话单查询等(特别是内存基本充足的场
景)。
8a 中的hash 索引分为Global Hash 和分段Hash,两者主要的区别是一个列上创建
hash 索引的范围不同。
Global hash 索引是在整个列数据上创建一个索引,分段hash 索引是将整个列数据
根据指定的dc 数(key_DC_size)分为几段,每段上创建一个索引。分段hash 索引
主要是便于空间回收。在磁盘空间不充裕的情况下推荐分段hash 索引。现场中,
使用Global Hash Index 的场景较多。
分段hash 索引语法举例如下:
CREATE INDEX idx_t_a ON t(a) key_DC_size = 1000 USING HASH GLOBAL;
建议:分段hash 索引的Dc 个数(key_DC_size)和一次查询扫描命中的dc 个数相
当,通常为400~2000。
8a 删除数据sql 的实现是给被删除数据打删除标记,数据本身仍在磁盘中存在,8a
的fast update 模式下update sql 实现是先删除原始数据行,插入新数据行。8a 对于
磁盘中有删除标记的数据提供了手动清除的sql:shrink space 语句,即执行时将具
有删除标记的数据从磁盘彻底清除,
释放磁盘空间,
shrink space 的块级回收和行级
回收模式下会同时对索引文件进行回收,即当索引文件对应的DC 全都被回收删除

GBase 8a MPP Cluster 最佳实践
2 性能调优
文档版本(2022-02-11)
南大通用数据技术股份有限公司
22
时将该索引文件也回收删除。
这种批量从磁盘删除数据的模式在大数据分析型数据
库中,可以有效且大幅的提升数据库管理性能。
以shrink space 的块级回收举例如下:
alter table t shrink space full block_reuse_ratio=30;
有效数据占比低于30%的DC 空间进行整合回收,将需要整合回收的DC 中具有删
除标记的无效数据进行彻底清除,DC 整合后重新落盘写seg 文件,无法保证原始
顺序。同时,如果有分段索引文件的数据段全部在需要整合的DC 集内,则将该分
段索引也回收清除,并在整合后重建该分段索引以保证索引的有效性。
在使用上,GBase8a 一定是首先进行智能索引过滤的,之后,如果发现查询条件中
的等值查询条件列上建立了Hash Index,则使用Hash Index,否则进行全DC 扫描。
这一点,可以在Trace Log 中明显观察到。
对有实时数据加载的场景,可以根据实际情况设置一定时长的时间窗口,在时间窗
口内先建立无索引的临时表加载数据,
积累到指定时长后再将临时表内数据插入到
带索引的同结构目标表中或在临时表上创建索引。一次性处理索引建立,可较大幅
度的降低索引带来的维护成本。
注意事项

索引是一种有损的优化手段,使用索引通常会带来维护的成本,会影响数据加
载及DML 操作的性能,实际使用时需根据具体需求而定。

选择建立hash 索引的列应尽量选择重复值较少的列,否则hash 冲突严重,影
响hash 索引的性能

二进制类型的列不适合使用HASH 索引

创建索引时,只能指定单列,不能指定多列创建联合索引

从 -200 至 -899 的错误代码表明执行 SQL 语句产生的问题。

语法
TIMESTAMPADD(interval,int_expr,datetime_expr)
函数说明
将整数表达式int_expr 加到date 或者datetime 表达式datetime_expr 上。
int_expr 的单位由interval 参数给定,是下列值之一:
FRAC_SECOND,SECOND,MINUTE,HOUR,DAY,WEEK,MONTH,
QUARTER,或YEAR。
interval 值可以使用上面的关键词指定,或者使用前缀SQL_TSI_。例如DAY 或
SQL_TSI_DAY,或者两者都可以。

GBase 8a MPP Cluster 产品手册
5 数据库管理指南
文档版本953(2022-09-15)
南大通用数据技术股份有限公司
817
示例
示例1:将“1”分钟加到“2020-01-02”上。
gbase> SELECT TIMESTAMPADD(MINUTE,1,'2020-01-02') FROM dual;
+-------------------------------------+
| TIMESTAMPADD(MINUTE,1,'2020-01-02') |
+-------------------------------------+
| 2020-01-02 00:01:00
|
+-------------------------------------+
1 row in set
示例2:将“1”周加到“2020-01-02”上。
gbase> SELECT TIMESTAMPADD(WEEK,1,'2020-01-02') FROM dual;
+-----------------------------------+
| TIMESTAMPADD(WEEK,1,'2020-01-02') |
+-----------------------------------+
| 2020-01-09 00:00:00
|
+-----------------------------------+
1 row in set