2020 SIGMOD:BinDex A Two-Layered Index for Fast and Robust Scan 笔记

简介: 目前的查询扫描主要归类为两种方法,一种是顺序扫描 如全表扫描,一种是通过索引扫描 如b-tree等。1. 顺序扫描可能需要访问大量的无用的数据,特别是当选择率低的时候。2. 索引扫描在选择率较高的时候,可能会导致大量的随机内存访问。这些都会导致性能的下降,所以在执行查询操作时,需要根据具体的查询情况(如选择率的高低),选择合适的方法(选择顺序扫描,还是索引扫描)用于查询。但随着数据库查询负载变得复杂,很难去选择合适的方法应对特定的查询(到底是选顺序扫描?还是索引扫描?)。因此本文提出了一种新的索引方案—BinDex(后面简称BD),可在不同的选择率情况下,同样能够快速地进行查询。BinDe

所以,BD的目标有两个:

  1. 如何减少 像顺序扫描那样访问大量的无用的数据(在低选择率的情况下)
  2. 如何减少 像索引扫描那样,带来的大量随机内存访问(在高选择率的情况下)
  3. 如何适用于所有的选择率场景?

背景知识

  1. 本文的Binning是指将多个属性值划分到不想交的多个范围当中,然后使用是一个bit vetcor(bit map→0-1组成的数组)来代表每个范围。值在这个范围内的标为1,不在则标为0 。

BinDex overview

本文介绍一下Bindex的结构:

1. BinDex的数据结构

virtual value space:注意这只是一个虚拟的结构,并没有真正存放在内存中(构建完之后就丢弃了)。其中存放的是按升序排好的N个元素。在原来的base data数据列中仍然是没有顺序的。
virtual areas:根据virtual value space中的元素划分为K个分区,每个分区包含N/K个排好序的元素。如这里的A1,A2。。每个Ai都包含4个值。每个Ai都作为一个bin,后续会用到。
基于上述两个虚拟的结构,设有K个Virtual area(k个bin),在BD中存在三个主要数据结构:Area Map,a set of filter bit vector,Position Array。如上图
Area Map:map S = {S1,S2,S3..Sk-1},Si对应着Ai+1,如这里的S1对应着A2。每个Si包含(value,count)这样一对值,如其中Si.value表示对应的Ai+1的第一个起始位置的值,Si.count表示Ai+1之前(A1到Ai)有多少个元素。如这里的S1包含(54,4),则54表示A2的第一个元素值为54,A2之前(A1)有个4个元素。若常量c满足,Si-1.value ≤ c < Si.value,则c落在Ai这个区间上。后面会经常用到这个结论来定位区间。
Filter Layer:第一层由a set of filter bit vector一组bit的vector组成,这些vector用于生成扫描的大概结果。基于k个virtual areas,生成k-1的filter bit vector {F1,F2...Fk-1}。即F1→A1,F2→A2...。如F1表示值落在A1中的结果(0≤x<52),对应的位置下标(在position array中)在F1中相应的位置设置为1。最终会生成K-1个bit vector,则进行谓词评估时,选择最接近结果的一个候选的vector(后面推导公式),这个vector中只有一小部分的值需要进行矫正。
Refine Layer:第二层是由Position Array组成。Position Array是基于上面提到的virtual value space中排好序的值的下标组成。该层的作用是将第一层生成的bit vector中某些需要矫正的值进行矫正,以生成最终的结果。矫正流程是这样的,首先通过对Area Map进行二分查找,定位到需要矫正的某个Virtual Area(即分区范围)。然后通过某个Virtual Area对应的Position Array一部分进行二分查找,取出Position Array中的下标,然后根据该下标在(Base Data)原来的数据列取出下标对应的值进行比较,找出需要矫正的值的下标(也即在bit vector中0-1的位置)。

相关文章
|
存储 SQL 负载均衡
列式存储引擎分析比对
列式存储具有高压缩率、利于列裁剪、以及高CPU计算效率(Cache Friendly)等特点,是分析型业务场景所选择的主流数据存储方案。 本文介绍了工业界一些常见的面向OLAP或HTAP场景数据库的列存存储引擎设计思路,并进行了总结和对比。
4024 3
SQL视图View(是一张虚拟的表)
SQL视图View(是一张虚拟的表)
154 0
|
SQL 移动开发 算法
MySQL 8.0.23 Hypergraph Join Optimizer代码详解
MySQL Join MySQL本身没有常规意义上的执行计划,一般情况就是通过JOIN和QEP_TAB这两个结构组成。QEP_TAB 的全称是Query Execution Plan Table,这个“Table“可以是物理表、内存表、常量表、子查询的结果表等等。作为整个单独JOIN执行计划载体之前还承担着整个执行路径的调用和流转,但是从8.0.20后,全面的生成了独立的
1991 0
MySQL 8.0.23 Hypergraph Join Optimizer代码详解
|
存储 算法 C++
【C++】哈希桶
哈希桶是哈希表中的基本存储单元,用于存放通过哈希函数映射后的数据元素。当不同元素映射至同一桶时,产生哈希冲突,常用拉链法或开放寻址法解决。哈希桶支持高效的数据插入、删除与查找操作,时间复杂度通常为O(1),但在最坏情况下可退化为O(n)。
472 6
|
机器学习/深度学习 人工智能 自然语言处理
《鱼与熊掌兼得:DataWorks中AI驱动的数据脱敏与可用性平衡术》
在数字化时代,数据成为企业核心资产,驱动业务决策与创新。DataWorks作为大数据处理平台,利用AI技术进行数据脱敏,确保隐私保护的同时维持数据可用性。通过生成对抗网络(GAN)和自然语言处理,DataWorks能生成既保留特征又符合隐私要求的脱敏数据,支持机器学习模型训练。此外,建立数据映射关系和应用数据增强技术,进一步提升脱敏数据的实用性和多样性。尽管面临挑战,DataWorks正不断优化算法,结合新兴技术,实现数据隐私与价值挖掘的平衡,助力数字经济健康发展。
557 29
|
7月前
|
SQL 分布式计算 大数据
SparkSQL 入门指南:小白也能懂的大数据 SQL 处理神器
在大数据处理的领域,SparkSQL 是一种非常强大的工具,它可以让开发人员以 SQL 的方式处理和查询大规模数据集。SparkSQL 集成了 SQL 查询引擎和 Spark 的分布式计算引擎,使得我们可以在分布式环境下执行 SQL 查询,并能利用 Spark 的强大计算能力进行数据分析。
|
canal 编解码 运维
飞天洛神云网络再度入选通信顶会 SIGCOMM'24
飞天洛神云网络再度入选通信顶会 SIGCOMM'24
438 12
|
Java 分布式计算 Hadoop
错误: 找不到或无法加载主类 org.apache.hadoop.mapreduce.v2.app.MRAppMaster
错误: 找不到或无法加载主类 org.apache.hadoop.mapreduce.v2.app.MRAppMaster
1878 0
错误: 找不到或无法加载主类 org.apache.hadoop.mapreduce.v2.app.MRAppMaster
|
消息中间件 存储 算法
深度揭秘!Kafka和ZooKeeper之间的相爱相杀
**摘要:** 本文介绍了Kafka和ZooKeeper的角色及其关系。Kafka是分布式流处理平台,用于实时数据管道和流应用;ZooKeeper是分布式协调服务,处理同步和集群协调。在Kafka中,ZooKeeper存储元数据,管理集群成员,选举Controller。随着KIP-500提案,Kafka计划移除对ZooKeeper的依赖,转向基于Raft的共识机制,以简化架构、提高性能和一致性。此外,文章提到了etcd作为基于Raft的元数据存储系统的应用。本文旨在帮助读者理解ZooKeeper在Kafka面试中的重要性,并了解Kafka的未来发展方向。
2071 2
|
存储 大数据 数据处理
ClickHouse中的ReplicatedMergeTree是什么
ClickHouse中的ReplicatedMergeTree是什么
1292 1