关键字:
KingbaseES、SQL、列存储
1.列存储与行存储
早期的RDBMS一般按行进行数据的组织,即每个关系可以近似为一个表格,一条数据在表格中占据一行(或多行),每行数据包含若干列(属性),对数据的增删查改都以行为单位进行。
随着时代的发展,数据库中需要通过大量聚合统计数据的需求(即OLAP场景的需求逐渐高涨),列存储在数据的修改场景中性能较差,但是能够快速的过滤出所需数据进行聚合统计。更具体地说,列存储的优势在于。
1.自动索引,列存储在内存中按照列方式存储,因此本身各列之间可以互相作为索引使用,无需额外数据结构对该列建立索引。
2.数据压缩,由于同一列中值的较高重复率以及同一列的数据在类型上的相似性,数据压缩可以较为高效的进行。
3.向量执行,列式存储结构有利于列式算子的实现,向量化进行计划执行。
2.列存储在KES的组织方式
列存表在KES中按列的形式存储数据,而不是在内存中组织的列存表,即on-disk结构是按照列进行组织的。CU在KES中只能以写追加的方式进行修改,即当进行列存数据删除时,对数据进行标记,而不能直接从物理或内存结构中删除;当进行修改时,对数据进行标记,随后加入一条新的数据。同时,无论对列存表存入1-60000条数据时,都将加入一个CU。
3.列存表的创建流程
1.DefineRelation创建表时transformRelOptions中识别创建的表是否是列存表
2.向sys_class加入tuple时进行记录
3.在CreateStmt执行过程中,当DefineRelation结束后,DBMS重新打开该表进行TOAST相关检查后,进行列存表过程(函数AlterCStoreCreateTables)
4.在这一过程中进行delta表与CU描述符的创建。
其余过程与行存表创建基本一致。
4.列存表主要机制介绍
列存表的物理结构就是列存表,但是KES的列存表可以伴随一个DELTA表,前面说到在修改少量数据时,KES仍以一整个CU的方式进行列存表处理。这样,随着运行时间的增长,产生的碎片将影响数据库系统性能。鉴于这一情况,KES的列存储机制引入了DELTA表——当数据进行少量修改时,数据将在DELTA表中进行操作,避免产生小CU以及碎片,DELTA表的修改与一般行存表一致,这一机制可以显著提高列存的性能表现。