前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >内存数据库的自动优化方法?

内存数据库的自动优化方法?

原创
作者头像
定向
发布2022-08-24 18:01:24
4370
发布2022-08-24 18:01:24
举报
文章被收录于专栏:IT科技IT科技

内存数据库的自动优化方法?

以一个直观的例子来解释这个问题,我们以全内存分布式数据库RapidsDB为例,要检查特定表的已排序行段组的当前状态,请在CLI环境中运行SHOW COLUMNAR MERGE STATUS FOR <table_name>来查看:

让我们仔细看结果的第一行,我们知道存储在分区0上的表的切片具有3个有序的行段组,一个由741个行段组成,一个由16个行段组成,最后一个由1行段组成,共计758个行段。考虑这种有序的行段组对非常简单查询的影响:

根据排序行段组的定义,第一个排序的行段组最多包含一个包含user_group = 15的行的行段,除非user_group = 15位于两个行段的边界上,或者如果存在较大数据倾斜并且几个行段仅由user_group = 15的行组成。类似的,第二排序行段组中最多一个行段包含相关行。这样,总共758个行段中只有三个将被打开和具体化。虽然本例中的查询非常简单,但类似的推理同样适用于复杂查询中。

现在我们看一下分区2上有序的行段组。很明显,它的优化程度远远低于剩下的2个,类似上面所示的选择查询将会导致物化8个行段。如果启用了background merger,并且没有或者少量工作负载同时运行,那么这个分区将会在几秒钟内得到优化。然而,在数据库执行大量的增删改任务时,background merger的处理性能会被影响。在这种情况下,不如通过手动触发pessimistic merger,让增删改任务和后台优化任务前后脚独立完成更合理:

如果当我们执行OPTIMIZE TABLE时运行SHOW COLUMNAR MERGE STATUS,那么我们将会看见其作用:

新出现的一行代表分区3上正在进行一个手动合并,此时已经完成了53.12%的工作任务。当完成合并任务后,现在情况更好了:

请注意,在本例中,没有任何分区被合并到单个有序的行段组中。其原因是,两种不同的合并方式均采用一种高级算法,该算法被优化为在并发写入的情况下进行小的分批次工作,并将数据保持在几个有序的行段组中,而不是试图将所有数据合并到单个有序的行段组中。如果可以牺牲一些数据处理时间来获得更高的查询性能,则可以运行手动命令,将每个分区上的数据合并到一个有序的行段组中:

此时,任何选择查询将只具体化每一个分区的一个行段。当向列式表中插入少量行时,使用内存中行存储支持的段来存储行。当这个以行存储为基础的段被填满时,后台刷新程序background flusher会定期将这些行刷新到磁盘中。通过运行OPTIMIZE TABLEFLUSH,可以手动将受行存储支持的段刷新到磁盘中。

至此,例子中数据表t的后台自动排序完成了。整个过程中,数据库无须用户干预,仅通过自动优化实现了高性能。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档