0
点赞
收藏
分享

微信扫一扫

2022-09-06 mysql/stonedb-通过知识网格来减少在NestedLoop中避免不必要的读取Pack


摘要:

Pack对应的描述数据为DPN,可以近似的理解为Pack的元数据. 知识网格是基于DPN的更上层的抽象。

本文说明在Nested Loop的遍历读取数据时, 如何通过知识网格来避免不必要的Pack读取。


IN操作符场景的处理

时序流程:

2022-09-06 mysql/stonedb-通过知识网格来减少在NestedLoop中避免不必要的读取Pack_列存储

 

关键模块:

  • InSetColumn:
  • IN操作符对应的虚拟列, 内部包含一个要访问的set数据集合
  • RSIndex_Hist:
  • 知识网格-直方图, 主要处理整形数据, 对每个Pack根据1024粒度建立直方图
  • 目的在于区间范围匹配时, 当区间与DPN之间存在交叉关系时, 进一步利用直方图来确认数据是否会落在该Pack

IN操作流程

一. 准备开始遍历Pack, 顺序获取DPN

DPN在启动时从磁盘读取,常驻内存

二. 从InSetColumn中获取IN集合的最小值和最大值, 建立匹配区间

三. 通过知识网格直方图确认本Pack是否在匹配区间内, 确定是否要处理本Pack

四. 经过粗糙集确认要处理本Pack后,从磁盘加载Pack数据, 解压数据, 逐row的遍历匹配

使用了知识网格但是依然存在大量要处理的Pack的原因

从InSetColumn中获取IN集合的最小值和最大值区间过大, 导致大量Pack都落在区间内

  1. min和max将大量的pack包含在内
  2. 但是set集合中的数据量并不大, 导致在读取Pack逐行匹配时大量的Pack不符合条件被丢弃

优化策略:

  1. TODO: 需要对逻辑做更多的理解
举报

相关推荐

0 条评论