摘要:
Pack对应的描述数据为DPN,可以近似的理解为Pack的元数据. 知识网格是基于DPN的更上层的抽象。
本文说明在Nested Loop的遍历读取数据时, 如何通过知识网格来避免不必要的Pack读取。
IN操作符场景的处理
时序流程:
关键模块:
- InSetColumn:
- IN操作符对应的虚拟列, 内部包含一个要访问的set数据集合
- RSIndex_Hist:
- 知识网格-直方图, 主要处理整形数据, 对每个Pack根据1024粒度建立直方图
- 目的在于区间范围匹配时, 当区间与DPN之间存在交叉关系时, 进一步利用直方图来确认数据是否会落在该Pack
IN操作流程
一. 准备开始遍历Pack, 顺序获取DPN
DPN在启动时从磁盘读取,常驻内存
二. 从InSetColumn中获取IN集合的最小值和最大值, 建立匹配区间
三. 通过知识网格直方图确认本Pack是否在匹配区间内, 确定是否要处理本Pack
四. 经过粗糙集确认要处理本Pack后,从磁盘加载Pack数据, 解压数据, 逐row的遍历匹配
使用了知识网格但是依然存在大量要处理的Pack的原因
从InSetColumn中获取IN集合的最小值和最大值区间过大, 导致大量Pack都落在区间内
- min和max将大量的pack包含在内
- 但是set集合中的数据量并不大, 导致在读取Pack逐行匹配时大量的Pack不符合条件被丢弃
优化策略:
- TODO: 需要对逻辑做更多的理解