Skip to content

模型Model

行存、列存与延迟取列

Row store · Column store · NSM · DSM · Late materialization

通过同一八行四列数据核算行列布局的扫描和重建成本,区分逻辑行对应、压缩与物理读取单位。

形式陈述 ​

同一关系可以采用不同物理布局。行存把一行的各字段放在一起;列存把同一字段的多行值放在一起。二者都必须保持“哪些字段来自同一输入行”的对应关系。本文使用内部行位置i作为这种对应,不把某列排序后的第i项擅自与另一列的第i项拼接。

为比较布局,在块传输模型中固定页有效载荷128字节,八行,每行四个16字节字段a,b,c,d,无NULL、压缩或额外元数据。行存一页容纳两行,共4页;列存每列一页,共4页。列存的字段位置i对应同一行,任何重排都必须让其他列跟随或保留置换映射。

一个先按a过滤、再返回d的列存计划可先读a,生成匹配位置集合I,再只取d中I所指的值;这称为延迟物化。I不是已返回的完整行,仍需保留重复输入位置。若最终要返回所有列,就必须支付其他列的访问和重建成本。

直觉

看一位顾客的全部资料,装在同一行里很方便;统计所有顾客的一列指标,列存能避免读入其余字段。优势来自访问形状,而不是“列存总比行存快”。

压缩是另一个选择。同类型相邻值可能更容易编码,但压缩数据仍有解码、随机定位和更新成本。字典代码大小关系若不保序,就不能直接用代码的大小比较代替原值比较。

例子与边界

令八行a分别为1,2,3,4,5,6,7,8,d分别为10,20,30,40,50,60,70,80。计算SUM(d):行存扫描4页;列存只读d的1页,得到360。这个例子没有依赖压缩,差异完全来自少读不相关列。

查询a≤2并返回d:列存读a页,得到位置I={0,1},再读d页,共2页,返回10、20。行存若没有辅助索引仍需扫描4页以证明没有其他满足行;若已有按a排序且能证明遇a>2即可停的访问路径,又是不同计划,不能拿它与无索引扫描混比。

已知行位置6,读取该行全部字段:行存只读包含第6、7行的一页;列存需读a、b、c、d四页。缓存全冷、无压缩的本例于是得到1对4。缓存命中会改变实际I/O,但不改变所需字段集合。

若只想读d的一个16字节值,页式设备仍读128字节,不是1/8次I/O。列值被分散在多页时,应按命中页的并集计费,而非机械按匹配行数计费。

重复行与压缩 ​

原关系模型页采用集合语义;这里进一步允许存储行出现采用bag读取语义。若两行的a,b,c,d完全相同,位置仍有两份,SUM必须累加两次。RLE可以把连续相同值表示为(value,length),但length代表贡献份数,不能只把value交给普通SUM一次。两个独立字典中代码7也未必表示同一原值,跨列或跨表连接前须确认字典语义兼容。

推论与应用

PAX把一组行限制在同一页或行组,组内按列放小段,折中同组字段重建与同列访问的局部性;它没有自动获得“只读一个字段就只传输该字段”的设备能力。压缩块、列段与I/O页的边界必须分别说明。

执行器可以传整行、位置列表或列批次。延迟取列可减少中间结果宽度,而连接复制多份匹配位置时仍须保留bag重数。计算计划成本时因此同时需要行数、行宽和物化方式,仅知道输出12行不够。

更新一行的多列时,列存还需保证跨列版本一致;行位置对齐本身不是事务原子性证明。事务可见性继续由MVCC或其他并发控制定义。

列批次的执行合同进一步见批次位置与借用期限;局部选择必须映回共同出现编号。位图堆访问则从多个索引组合候选位置,内存退化到整页时用完整谓词重检;这些接口不改变本页布局与页并集计费。

参考资料
关系图谱8 个相邻概念 · 2 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系