• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
编写人生
写写代码,写写人生
博客园    首页    新随笔    联系   管理    订阅  订阅
一种更高查询性能的列存储方式MaxMinT 第一部分

简介
本文描述了一种列存储方式和对应的查询方法,这种存储方式具有更好的查询性能和更小的存储空间。

And查询

本文先用直观的图形方式展示and查询时的方式,这也是算法要解决的问题核心。
通常在OLAP数据查询时,需要进行and处理,例如你需要获取 year = 2017 and customer = 13 的数据,这在列存储中实际是对值 year的2017这个列和 customer的13列进行and操作,而这些列一般都使用位图的方式存储。
市面上有很多位图的存储方式,比如WAH, EWAH, Concise和Roaring Bitmap。他们有各自的优缺点,今天我设计的就是一个新的存储方法,我给他起了一个名字,MaxMinT。
OLTP数据也是如此,只不过OLTP通常使用行存储而不是列存储,因此不适合此算法。
下图展示了这两个列的数据抽象概念,空白的区域表示全部都是0的数据,而阴影的部分表示具有比较密集的有效数据的区域。当进行and 操作时,结果就是红色原因部分的区域,即共同拥有的部分。

为找到这些红色区域,我们首先从开头的位置创建一条线,从程序上来说就是创建一个游标,初始化为0。

检测所有参与and运算的列,在这个案例中只有两个列year.2017和customer.13,顺序扫描这些列,确定列是否处于空白区域,如果是,那么获得到此空白区域的最下端位置nextPos,如果阴影区域,不用计算下端位置。

如果至少有一列处于空白区域,那么获取到nextPos的最大值,将游标移动到此位置,表示这些位置没有任何输出结果,如下图所示。



现在,继续重复刚才的扫描,由于当前位置没有任何一个列处于空白区域,那么就获取这些列的阴影最下端位置,现在我们获取这些阴影区域的最小值,将游标移动到此位置,那么这个区域就是有效的区域,作为and的输出结果,如下图所示。

重复此操作,直到文件的末尾。

 我将在第二章介绍数据的存储方式。

posted on 2017-08-12 20:33  编写人生  阅读(385)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3