DORIS - DORIS查询优化之行列混存

什么是点查询?

什么是点查询?一句话:点查询,就是指根据KEY从数据库中取出一行或几行数据的过程。
所谓的「点查询」,指的是在查询数据库表时,通过等值的条件筛选(WHERE 字段名=字段值),一般通过走索引的方式,以非常快的速度,获取到目标结果的查询方式。如果你查询的条件走了索引,且符合条件的目标数据量很小的话,那么这个查询效率就会非常高。

目的

提升DORIS点查的性能。

简介

Doris 默认采用列式存储,每个列连续存储,在分析场景(如聚合,过滤,排序等)有很好的性能,因为只需要读取所需要的列减少不必要的 IO 。但是在点查场景(比如 SELECT *),需要读取所有列,每个列都需要一次 IO 导致 IOPS 成为瓶颈,特别对列多的宽表(比如上百列)尤为明显。为了解决点查场景 IOPS 的瓶颈问题,Doris 2.0.0 版本开始支持行列混存,用户建表时指定开启行存后,点查(比如 SELECT *)每一行只需要一次 IO,性能有数量级提升,但是需要额外的空间来存储行存。 行列混存开启后,会在一行中包括多列数据,缓存可能被大查询给刷掉,为了增加行缓存命中率,单独引入了行存缓存,行缓存复用了 Doris 中的 LRU Cache 机制来保障内存的使用,同时需要在BE中进行配置,来开启行存缓存。

优势

A. 单次读取整行数据时效率更高。
B. 大大减少了磁盘访问次数。

存储设计

用空间换效率。

开启行存后,Doris会将行存数据编码后存在单独的一列中,列名为隐藏列 DORIS_ROW_STORE_COL,需要通过额外的空间来存储,与 AnalyticDB 的行存格式不同,Doris 中的行式存储格式比较简单,以 JSONB 作为行存的编码格式。

A. 通过jsonb_extract等函数可以高效访问JSON内部字段。
B. ID查询或者可以转换为ID查询的情况下,可以通过隐藏列的 Column ID 来定位该列,通过其行号定位到某一具体的行,直接反序列化各列,按需返回即可。

注意事项

1. 用户可以在在 Olap 表中开启行存模式。
2. 开启行存:默认为 false 不开启行列混存(行存模式仅支持在建表的时候开启,在建表的 PROPERTIES 中指定是否开启行存)
   "store_row_column" = "true"

3. 指定部分列开启行存
   "row_store_columns" = "column1,column2,column3"

4. 指定行存读写的最小单元,这个值越大压缩效果越好存储空间占用越低,点查性能越低,反过来值越小存储空间约高,点查性能越好。
   默认值16KB(16 * 1024)是大多数情况下比较均衡的选择,如果更偏向查询性能可以配置较小的值比如 4KB 甚至更低,
   如果更偏向存储空间可以配置较大的值比如 64KB 甚至更高。
   "row_store_page_size" = "16384"
   
5. 需要额外的空间来存储行存数据。
6. 行存引擎只支持单表key列等值查询,不支持join、嵌套子查询,where条件里需要有且仅有key列的等值,可以认为是一种key value查询。
7. light_schema_change 应该被开启, 因为主键点查的优化依赖了轻量级 Schema Change 中的column unique id 来定位列。
8. 开启行缓存。(Doris 中有针对 Page 级别的 Cache,每个 Page 中存的是某一列的数据, 所以 Page cache 是针对列的缓存)。

列缓存与行缓存

1.列缓存,Doris中有针对 Page 级别的 Cache,每个 Page 中存的是某一列的数据,Page Cache 是针对列的缓存。 2.行缓存,Doris的一行中包括了多列数据,缓存可能会被大查询给刷掉,为了增加行缓存命中率,单独引入了行存缓存(Row Cache)的设计。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cloneme01

谢谢您的支持与鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值