what-if
① 介绍了Slalom,一个in-situ查询引擎,它使用索引来最小化工作负载延迟。Slalom采用最先进的in-situ查询技术,通过轻量级监控收集的信息进行分区和索引决策。
② accommodates workload shifts by monitoring user access pattern / makes on-the-fly partitioning and indexing decisions, based on information collected by lightweight and monitoring.
pre
分区是指将一个大的数据集合分割成多个小的数据子集,每个子集称为一个分区。分区通常是根据某些特定的属性或规则进行划分,例如按照时间、地理位置、用户等进行划分。
⇒ 通过对数据进行分区,可以减少查询时需要扫描的数据量,提高查询效率和性能。
in-situ查询 直接在原数据上进行处理而不会将数据加载到传统的数据库中以减少数据的加载和格式转换的时间和成本 ⇒ 提高查询效率
每个查询都集中在一个不断变化但很小的范围内 ⇒ 索引
related works
- 方法
- 文件嵌入索引
- 查询原始文件
- 问题
- 可交互,负载变化,不能依赖于过去的负载样本学习。负载的变化可能会导致之前基于此建立的索引、视图不起作用 ⇒ 能不能减少这个投资的浪费 ⇒ 动态分区并保证这个开销不大
- 初始数据加载有延迟 ⇒ 能不能不加载
- 物理重组太麻烦 ⇒ 逻辑,不在物理中进行任何的操作包括copy和sort
architecture
- index ⇒ 两种都是分区特定的索引,内部的
- value-existence索引:跳过
- value-position索引:B+-Tree
- 何时建立?
- why:索引的构建需要占用更多的内存和时间,早晚有影响
- when:在数据加载完成后,但在查询开始之前
- slalom使用随机算法来确定合适建立index
- 二进制缓冲:对二进制处理更快,用算法决策缓存的二进制块大小和淘汰算法
- 根据统计学的方法,heat和frequency,分区的min、max、devi、物理页面和文件的size等来评估分区和索引的构建、负载的变化 ⇒ 反馈、调整
- 当收到反馈后,会自动进行调整,太差了就淘汰
- 有部件要评估索引的建立是否合理和有效 ⇒ what-if
- 在末尾放一个闲置分区用来存新来的数据
- 索引存在每个分区的列里,或者二进制缓存中
details
partiton
最小的分区大小为一个磁盘页,因为所有操作最终要回到物理层面,页面操作方便
逻辑分区在分区过滤方面的效率主要取决于数据分布,并且在集群或排序数据时表现最佳
⇒ 数据分布很重要,能不能做数据增强或者什么方法改善(不确定)
每个分区包含均匀分布的值,分区中均匀分布的值可以对分区中的所有值进行高效的索引访问
⇒ 创建不相交的分区可以改进分区跳过。
分区会随着查询的增加逐步分裂,直到稳定,稳定判断条件:
新分区中值的方差以及值分布的超峰度是否变得小于父分区中的方差和峰度
⇒ 因为查询通常会跳过不包含所需数据的块。如果一个块中包含大量离群值,则查询可能需要扫描整个块才能找到所需数据,这会导致性能下降。
不同值的数量已经减少了,意味着数据变得更加集中,这有助于提高查询性能。
⇒ 一个分区中不同值的个数,当一个分区被拆分成更小的子集时,每个子集中可能会有一些相同的值,因此不同值的数量会减少
最大化每个新分区的选择性?
experiments
不同参数对Slalom性能的影响
内存预算:
⇒ 随着内存预算的增加,Slalom的查询处理时间和磁盘访问次数都会显著降低,而内存占用则会逐渐增加。
分区大小:分区大小也是影响Slalom性能的重要参数之一。
⇒ 较小的分区大小可以提高查询处理时间和减少磁盘访问次数,但会增加内存占用。
索引类型:
⇒ 值位置索引可以显著提高查询处理时间和减少磁盘访问次数,但会增加内存占用。
缺点
- 在某些需要大量聚合操作的查询中,Slalom的性能不如基于列存储的系统
- 列存储系统将每个列作为一个独立的数据结构进行处理,可以更好地利用现代CPU的并行计算能力。
- 预处理和索引建立时间较长
- 在数据集较大或变化频繁时,这一过程可能需要较长时间。这可能会影响Slalom的实时性能和可扩展性。
- 对于具有复杂访问模式和变化频率较高的工作负载,Slalom✔
- 在某些需要大量聚合操作的查询中,Slalom的性能不如基于列存储的系统