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

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的输出结果,如下图所示。

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

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

最新文章

  1. 解决Android studio导入项目卡死
  2. Spring MVC配置
  3. PL-SQL(免安装版本)报错ORA-12154
  4. Qt from Linux to Windows target
  5. Logical Databases逻辑数据库
  6. golang面向对象初识
  7. redis缓存数据表
  8. 之前可运行mongodb,后来却不行了显示Unclean shutdown detected mongodb
  9. webserver<2>
  10. C#编写自动关机程序复习的知识
  11. poj 3323 Matrix Power Series (矩阵乘法 非递归形式)
  12. TCP数据包结构
  13. WPF 完美截图 <序>
  14. fdisk 命令详解
  15. 两种序列化的方法 Serializable Parcelable
  16. Rancher + k8s + docker 部署资料
  17. 【Spark】SparkStreaming-加载外部配置文件
  18. CentOS7系统安装Nginx进行跨域处理
  19. Bootstrap学习--栅格系统
  20. Canvas 与 SVG 的区别

热门文章

  1. [LeetCode] Friend Circles 朋友圈
  2. 【Android Developers Training】 5. 序言:添加Action Bar
  3. ifame高度自动适应子页面内容
  4. ionic 最简单的路由形式,头部固定,下面tab切换-------一个简单的单页切换起飞了
  5. 修改MySQL数据库密码
  6. PhpStorm配置PHP解释器(wampServer版)
  7. TCP错误恢复特性之一TCP重传
  8. MySQL常用基本命令
  9. Django学习(七)---添加新文章页面
  10. U盘发现器