openGauss新特性 | HTAP新特性介绍

一、行列融合功能简介

HTAP 行列融合特性在单机、主备场景下,通过节点的行列双格式内存模式,实现openGauss HTAP一体化数据库架构。 通过高效的行列转换技术方案,节点读取磁盘行存数据,生成列存储单元(Column Unit)存储至节点的列缓存中;支持节点通过代价估算生成列缓存查询计划,通过列存查询大幅提升复杂OLAP场景下的数据分析效率,使数据库同时具备较强的TP和AP能力。在主备场景下,列缓存数据均存储在备节点,通过日志读取回放,同步主节点在OLTP场景下大量的行数据变更,以维持列缓存数据的新鲜度。

openGauss主备集群场景下,支持备节点形成行列双格式内存形式。针对主节点的行级修改,备节点通过日志同步主节点修改,将对应修改写入增量表中。同时,备节点后台启动的同步线程,将增量表中存储的行存修改同步至列存缓存中。用户在备节点发起的OLAP大型数据分析请求,将先通过逻辑判断是否已有查询表的列缓存数据,并根据代价计算形成基于列缓存的查询计划。

二、行列融合参数介绍

enable_imcsscan

参数说明:开启列缓存查询功能。

开启后,openGauss支持通过列缓存扫描,执行计划将根据表是否已行列转换及代价估算明确最终是否通过列缓存扫描。

取值范围:布尔型

默认值:off

enable_parallel_populate

参数说明:开启并行行列转换。

取值范围:布尔型

默认值:on

max_imcs_cache

参数说明:设置列缓存所使用的缓冲区的大小。

取值范围:整型,102400~INT_MAX,单位为kB。

默认值:100MB

设置建议:行列融合使用max_imcs_cache设置的缓冲区进行列缓存的存储,当增大max_imcs_cache配置时,需增大max_process_memory的大小以符合内存的基本逻辑校验。当行列转换的表数据大于配置的列缓存存储空间时,系统将存储临时文件。

三、行列融合操作介绍

HTAP 行列融合特性支持用户针对全表、表指定列、指定分区进行行列转换及清除已有列缓存操作。

对指定行表进行行列转换

转换方式1:全表转换

 ​​​​

sql
ALTER TABLE table_name IMCSTORED;

转换方式2:表部分列转换

sql
ALTER TABLE table_name IMCSTORED(column_name_list);

转换方式3:对分区表的指定分区转换

sql
ALTER TABLE table_name MODIFY PARTITION partition_name IMCSTORED;

​​​​​​

转换方式4:对分区表的指定分区的部分列转换,支持不同分区转换不同列​​​​​​​

sql
ALTER TABLE table_name MODIFY PARTITION partition_name IMCSTORED(column_name_list);

清除已转换的列缓存

清除方式1:对指定行表做全量列缓存清除​​​​​​​

sql
ALTER TABLE table_name UNIMCSTORED;

清除方式2:对分区表的指定分区做列缓存清除​​​​​​​

sql
ALTER TABLE table_name MODIFY PARTITION partition_name UNIMCSTORED;

普通表示例​​​​​​​

sql
--创建普通表
openGauss=# CREATE TABLE test
(id   INT,name VARCHAR2(40),dept_id    INT
);
CREATE TABLE
--对该表进行行列转换
openGauss=# ALTER TABLE test IMCSTORED;
ALTER TABLE
--查询该表,执行行存计划
openGauss=# EXPLAIN SELECT * FROM test;QUERY PLAN                        
---------------------------------------------------------Seq Scan on test  (cost=0.00..16.01 rows=601 width=106)
(1 row)
--开启列存扫描计划
openGauss=# SET enable_imcsscan=on;
SET
--查询该表,执行列存计划
openGauss=# EXPLAIN SELECT * FROM test;QUERY PLAN                             
--------------------------------------------------------------------Row Adapter  (cost=10.60..10.60 rows=601 width=106)->  IMCStore Scan on test  (cost=0.00..10.60 rows=601 width=106)
(2 rows)
--对该表清除列缓存
openGauss=# ALTER TABLE test UNIMCSTORED;
ALTER TABLE
--对该表部分列进行行列转换
openGauss=# ALTER TABLE test IMCSTORED(id);
ALTER TABLE

分区表示例

sql
--创建分区表
openGauss=# CREATE TABLE test_partition
(id   INT,name VARCHAR2(40),dept_id    INT,age  INT
) PARTITION BY RANGE(dept_id) SUBPARTITION BY RANGE (age) 
(PARTITION dept_id_p1 VALUES LESS THAN (5) (SUBPARTITION age_sub_p1 VALUES LESS THAN (25),SUBPARTITION age_sub_p2 VALUES LESS THAN (35),SUBPARTITION age_sub_p3 VALUES LESS THAN (maxvalue)),PARTITION dept_id_p2 VALUES LESS THAN (maxvalue) (SUBPARTITION age_sub_p4 VALUES LESS THAN (25),SUBPARTITION age_sub_p5 VALUES LESS THAN (35),SUBPARTITION age_sub_p6 VALUES LESS THAN (maxvalue))
);
CREATE TABLE
--对该表进行全量行列转换,即所有分区、所有列
openGauss=# ALTER TABLE test_partition IMCSTORED;
ALTER TABLE
--对该表清除列缓存
openGauss=# ALTER TABLE test_partition UNIMCSTORED;
ALTER TABLE
--对该表 dept_id_p1 分区的所有列进行行列转换
openGauss=# ALTER TABLE test_partition MODIFY PARTITION dept_id_p1 IMCSTORED;
ALTER TABLE
--对该表 dept_id_p1 分区清除列缓存
openGauss=# ALTER TABLE test_partition MODIFY PARTITION dept_id_p1 UNIMCSTORED;
ALTER TABLE
--对该表 dept_id_p1 分区的 id, name 列进行行列转换
openGauss=# ALTER TABLE test_partition MODIFY PARTITION dept_id_p1 IMCSTORED(id, name);
ALTER TABLE
--对该表 dept_id_p2 分区的 name, age 列进行行列转换
openGauss=# ALTER TABLE test_partition MODIFY PARTITION dept_id_p2 IMCSTORED(name, age);
ALTER TABLE
--开启列存扫描计划
openGauss=# SET enable_imcsscan=on;
SET
--查询该表 dept_id_p1 分区的 id, name 列, 执行列存计划
openGauss=# EXPLAIN SELECT id, name FROM test_partition PARTITION(dept_id_p1);QUERY PLAN                                           
-----------------------------------------------------------------------------------------------Row Adapter  (cost=5.58..5.58 rows=583 width=102)->  Vector Partition Iterator  (cost=0.00..5.58 rows=583 width=102)Iterations: 1, Sub Iterations: 3->  Partitioned IMCStore Scan on test_partition  (cost=0.00..5.58 rows=583 width=102)Selected Partitions:  1Selected Subpartitions:  ALL
(6 rows)
--查询该表 dept_id_p2 分区的 name, age 列, 执行列存计划
openGauss=# EXPLAIN SELECT name, age FROM test_partition PARTITION(dept_id_p2);QUERY PLAN                                           
-----------------------------------------------------------------------------------------------Row Adapter  (cost=5.58..5.58 rows=583 width=102)->  Vector Partition Iterator  (cost=0.00..5.58 rows=583 width=102)Iterations: 1, Sub Iterations: 3->  Partitioned IMCStore Scan on test_partition  (cost=0.00..5.58 rows=583 width=102)Selected Partitions:  2Selected Subpartitions:  ALL
(6 rows)
--查询整张表 id, name 列, dept_id_p2 未转换 id 列, 执行行存计划
openGauss=# EXPLAIN SELECT name, age FROM test_partition;QUERY PLAN                                      
-------------------------------------------------------------------------------------Partition Iterator  (cost=0.00..15.83 rows=583 width=102)Iterations: 2, Sub Iterations: 6->  Partitioned Seq Scan on test_partition  (cost=0.00..15.83 rows=583 width=102)Selected Partitions:  1..2Selected Subpartitions:  ALL
(5 rows)
--查询整张表 name 列, dept_id_p1、dept_id_p2 均转换 name 列, 因此执行列存计划
openGauss=# EXPLAIN SELECT name FROM test_partition;QUERY PLAN                                           
-----------------------------------------------------------------------------------------------Row Adapter  (cost=10.58..10.58 rows=583 width=98)->  Vector Partition Iterator  (cost=0.00..10.58 rows=583 width=98)Iterations: 2, Sub Iterations: 6->  Partitioned IMCStore Scan on test_partition  (cost=0.00..10.58 rows=583 width=98)Selected Partitions:  1..2Selected Subpartitions:  ALL
(6 rows)

总结​​​​​​​

openGauss 通过简单的指令设置,有效利用备节点可用内存空间进行行存数据的列缓存转换及存储(In-Memory-Column-Store)。考虑列存的查询优势,在数据量庞大,表结构复杂,而用户仅关注部分列数据的查询的场景下,行列转换后的列缓存可有效提升企业执行大型复杂OLAP数据分析的整体查询效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/78548.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

双目测量中的将视差图重投影成三维坐标图

双目测距主要步骤如下: 左右两张图片 → 匹配 → 得到视差图 disp; 使用 cv2.reprojectImageTo3D(disp, Q) 将视差图 重投影 成三维坐标图 → 得到 points_3d 什么是 points_3d? points_3d cv2.reprojectImageTo3D(disp, Q)points_3d.shap…

《深度剖析:SOAP与REST,API集成的两极选择》

API作为不同系统之间交互的桥梁,其设计与实现的优劣直接影响着整个软件生态的运转效率。而在API的设计领域,SOAP和REST犹如两座巍峨的山峰,各自代表着截然不同的设计理念与应用方向,成为开发者在构建API时必须慎重权衡的关键选项。…

非对称加密算法(RSA、ECC、SM2)——密码学基础

对称加密算法(AES、ChaCha20和SM4)Python实现——密码学基础(Python出现No module named “Crypto” 解决方案) 这篇的续篇,因此实践部分少些; 文章目录 一、非对称加密算法基础二、RSA算法2.1 RSA原理与数学基础2.2 RSA密钥长度…

Pillow 玩图术:轻松获取图片尺寸和颜色模式

前言 在这个“图像为王”的时代,谁还敢说自己没被一张图折磨过?一张图片不讲武德,说崩就崩,说卡就卡,仿佛像素里藏着程序员的眼泪。不管你是网页设计师、AI炼丹师,还是只是想把猫片修得像艺术品,图片的尺寸和颜色模式都是你必须掌握的第一手情报。如果你不知道它有多宽…

下载core5compat 模块时,被禁止,显示 - servese replied: Forbbidden. -->换镜像源

怎么解决? --->换镜像源 方法 1:使用命令行参数指定镜像源 在运行 Qt 安装器时,通过 --mirror 参数指定镜像源: # Windows qt-unified-windows-x64-online.exe --mirror https://mirrors.ustc.edu.cn/qtproject# Linux/macO…

WPF中Behaviors

行为的好处 可以把复杂的界面逻辑抽象出去&#xff0c;让xaml的界面设计更简单&#xff0c;更清爽 1.安装包 Microsoft.Xaml.Behaviors.Wpf2.简单实现拖动效果 <Border Width"100"Height"100"Background"Red"><i:Interaction.Behav…

GitHub 趋势日报 (2025年05月03日)

本日报由 TrendForge 系统生成 https://trendforge.devlive.org/ &#x1f4c8; 今日整体趋势 Top 10 排名项目名称项目描述今日获星总星数语言1hacksider/Deep-Live-Camreal time face swap and one-click video deepfake with only a single image⭐ 1582⭐ 59337Python2aip…

Oracle OCP认证考试考点详解083系列08

题记&#xff1a; 本系列主要讲解Oracle OCP认证考试考点&#xff08;题目&#xff09;&#xff0c;适用于19C/21C,跟着学OCP考试必过。 36. 第36题&#xff1a; 题目 解析及答案&#xff1a; 关于数据库闪回&#xff08;FLASHBACK DATABASE&#xff09;功能&#xff0c;以下…

优化01-统计信息

Oracle 的统计信息是数据库优化器生成高效执行计划的核心依据。它记录了数据库对象&#xff08;如表、索引、列等&#xff09;的元数据信息&#xff0c;帮助优化器评估查询成本并选择最优执行路径。以下是关于 Oracle 统计信息的详细介绍&#xff1a; 一、统计信息的分类 表统…

动态规划-面试题08.01三步问题-力扣(LeetCode)

一、题目解析 此题可以类比第N个泰波那契数 二、算法解析 1、状态表示 根据上面的分析和题目要求&#xff0c;dp[i]表示&#xff1a;到达i位置&#xff0c;一共有多少种方法 2、状态转移方程 以i位置的状态&#xff0c;以最近一步划分问题 dp[i] 从i-1->i dp[i-1] 从…

kotlin中枚举带参数和不带参数的区别

一 ✅ 代码对比总结 第一段&#xff08;带参数 工具方法&#xff09; enum class SeatPosition(val position: Int) {DRIVER_LEFT(0),DRIVER_RIGHT(1),SECOND_LEFT(2),SECOND_RIGHT(3);companion object {fun fromPosition(position: Int): SeatPosition? {return SeatPosi…

Java使用JDBC操作数据库

1.创建一个数据库一会用来连接 2.使用idea新建一个Java项目 3.在pom文件中加上相关依赖&#xff0c;并配置Maven路径 <dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>…

重名导致does not name a type

今天在Ubuntu24.04上编成时&#xff0c;makefile编译报错: falsecolor.h:48:9: error: ‘FalseColor’ does not name a type48 | FalseColor* content ;| ^~~~~~~~~~falsecolor.h的部分代码如下: class FalseColor {public:FalseColor(int w, int h){width …

Vue3 后台管理系统模板

Vue3 后台管理系统模板 gie仓库地址 一个基于 Vue3 TypeScript Element Plus 的后台管理系统模板&#xff0c;集成了动态路由和权限管理功能。 技术栈 Vue 3.2TypeScript 4.5Vue Router 4Vuex 4Element Plus 2.9AxiosLess 功能特性 &#x1f680; 基于 Vue3 最新技术栈开…

林业数智化转型初步设计方案

最近应林业方面的朋友要求,帮助其设计了林业方面的数字化智能化转型的方案设计,编写了如下内容,供大家参考,林业方面主要有三大方向,即林业生态、生物灾害和疫源疫病,目前已经建成了一些信息化系统,但在数字化智能化方面偏弱,就想着如何借助人工智能、物联网、大数据和…

springboot单体项目的执行流程

首先就是启动springboot项目&#xff0c;即执行主函数&#xff0c;这个主函数的类通常带有SpingBootApplication注解&#xff0c;类中的main方法就是程序的入口。 启动主函数后&#xff0c;SpringBoot会按特定顺序加载配置文件&#xff0c;如application.properties或applicat…

Python格式化字符串的四种方法

Python格式化字符串的四种方法 1.使用 % 运算符 %s 是一个字符串的占位符&#xff0c;而 “World” 是替换它的值 print("Hello, %s!" % "World") # 输出&#xff1a;Hello, World!你可以使用多个占位符 注意&#xff1a;多个变量占位&#xff0c;变量要…

【Redis】缓存|缓存的更新策略|内存淘汰策略|缓存预热、缓存穿透、缓存雪崩和缓存击穿

思维导图&#xff1a; Redis最主要的用途&#xff0c;三个方面&#xff1a; 1.存储数据&#xff08;内存数据库&#xff09; 2.缓存&#xff08;redis最常用的场景&#xff09; 3.消息队列 一、什么是缓存 我们知道对于硬件的访问速度来说&#xff0c;通常情况下&#xff1…

中阳视角下的趋势确认策略:以数据为核心的交易思维

中阳视角下的趋势确认策略&#xff1a;以数据为核心的交易思维 在动态交易市场中&#xff0c;如何在波动中捕捉相对确定的趋势&#xff0c;是每一位操作者关心的问题。“中阳”理念主张通过结构性价格分析&#xff0c;判断市场情绪的拐点。尤其是在出现大阳线或中阳线时&#x…

【C/C++】inline关键词

C inline 关键字学习笔记 一、什么是 inline 函数&#xff1f; inline&#xff08;内联&#xff09;是 C 中的一个关键字&#xff0c;表示“将函数的代码直接插入到调用点”&#xff0c;以减少函数调用开销&#xff0c;提升执行效率。 ✅ 注意&#xff1a;inline 是一种“请求…