ColumnLowCardinality
LowCardinality 数据结构
主要数据结构. 两个内部类.
Dictionary dictionary;
Index idx;
跟踪 创建 LowCardinalityColumn 方法。
- Indexes 是 UInt8为类型的列. 是不是有点小?
/Users/growingio/Software/clickhouse-gio/src/Storages/StorageInMemoryMetadata.cpp 327 会有使用DataTypeLowCardinality这个类.
- ColumnUnique是用来存储实际的String值,且去重保证唯一。为保证ColumnUnique需要HashTable.
如何创建
Debug
insert into tree_dict values (1, 'e');
Insert ColumnLowCardinality时,会把对应字段读入内存.
将已有的数据从存储读入内存反序列化以后,根据读入创建一个LowCardinality数据类型的对象。
这里开始对插入的'e'进行建立索引的操作.
ColumnLowCardinality
- ColumnUnique<ColumnType>::uniqueInsertRangeImpl 在Insert时 src 列 已经从('a','b','c','a') 变成了 ('a','b','c')。
- positions_column 的设计意图 ? 向外传递给ColumnLowCardinality的 Index数据结构.
- new (&buf[place_value]) Cell(key, *this); *this是什么. *this是个HashTablet
ReverseIndex中的column用于存储对去重后的data.
当在
写入ColumnLowCardinalityString 序列化流程图.
ColumnLowCardinality的序列化与反序列化
-
为什么不直接保存ColumnLowCardinality的所有信息(已经计算过),当读取时直接从磁盘中反序列化出来就可以了? 参见CoumnLowCardinality的Serialization方法。需要了解ColumnUnique是如何进行序列化的.
Client 端对ColumnLowCardinality序列化流程 如下图
这是为什么在Server端得到的column已经是ColumnLowCardinality类型的原因了。但是这样有个问题就是在Client端会计算一遍Hash值,然后会在Server端再进行计算一遍Hash。性能损耗?