ClickHouse PODArray

 

PaddedPODArray<> 模板: 理解Column内存布局的金钥匙

 
ClickHouse 设计者使用ColumnString类型中的getDataAt()方法实际调用的是PODArray类型.
Chars 使用PaddedPODArray<UInt8>类型, PaddedPODArray模板中的T类型是UInt8.

Offsets,记录累计偏移量,快速计算元素偏移及元素大小.

 
/Users/growingio/Software/clickhouse-gio/src/Columns/IColumn.h 321.
我们可以看到 针对任何Column的Offsets 是公用PaddedPODArray中的内存单元,最小单位是8Bytes.(PODArrayBase 模板中的 sizeof(UInt64)).
 
  • 理解保证可以使用offsets[-1].
 
从注释中我们可以看到:
我们从代码中也可以看到c_start 指向的位置 allocated + pad_left; offsets[-1]是得到*(c_start-1).
// 这里有个细节,如果有左对齐的最后一步会把c_start左侧的一个ELEMENT_SIZE的空间大小置为0,也就是说为什么offsets[-1]不会越界的原因. memset(c_start - ELEMENT_SIZE, 0, ELEMENT_SIZE).
 
并且分配内存会大于实际类型需要的内存大小。

PaddedPODArray<UInt8>的草图

 
以申请 1个 UInt8为例,会多分配pad_right+pad_left的内存大小,一共分配1+pad_right+pad_left.
PODArrayBase 内存分配细节如图:
pad_left (16 bytes) , data(1byte), pad_right(15 bytes)
_______________c_start_01_____________c_end_of_storage
Allocated
_______________c_start_01_____________c_end_of_storage
我们以
localhost :) select toString(map('1', 2)); 进行debugT
offsets记录在特定PODArrayBase中各行在对应的PODArrayBase中的偏移量。offsets[i] - offsets[i-1]就是第i-1行的占用的大小。
 
                                
 
                                    DataType 基本结构图
 

 

 

posted @ 2021-12-06 10:02  博客记  阅读(541)  评论(0编辑  收藏  举报