简介
本文描述了一种列存储方式和对应的查询方法,这种存储方式具有更好的查询性能和更小的存储空间。
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的输出结果,如下图所示。
重复此操作,直到文件的末尾。
我将在第二章介绍数据的存储方式。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
2005-08-12 发现一篇关于.NET 2.0中关于事务命名空间的好文章