news 2026/3/2 7:45:45

【openGauss】数据库微观案例

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【openGauss】数据库微观案例

本期介绍openGauss系数据库的几个案例:

  1. rowid使用案例
  2. GUC参数非全局设定
  3. hash分区键限制

astore引擎下的rowid使用问题

Oracle迁移经常会遇到rowid兼容性问题:可能是不支持rowid,也可能是rowid类型或行为有差异。

rowid的常用场景:

  • 确保无主键表排序结果稳定性
  • 删除表中的重复记录
  • 方便DML操作定位行

很多openGauss发行版都支持了rowid功能,最近在项目中遇到一个问题,业务使用JDBC驱动pbe方式执行如下语句:

deletefromtab1whererowid=?;

执行计划走了Seq Scan,没走预期的Tid Scan

preparestmt(varchar)asselect*fromtab1whererowid=$1;postgres=# explain execute stmt('nMYAAA==5sAAAA==gAA=');QUERYPLAN--------------------------------------------------------------Seq Scanontab1(cost=0.00..230557.40rows=50000width=36)Filter:(rowid=($1)::rowid)(2rows)

如果直接使用静态值,则能走Tid Scan

postgres=# explain delete from tab1 where rowid ='nMYAAA==5sAAAA==gAA=';QUERYPLAN----------------------------------------------------------Deleteontab1(cost=0.00..4.02rows=1width=6)->Tid Scanontab1(cost=0.00..4.02rows=1width=6)TID Cond:(ctid='(49382,128)'::tid)Filter:(tableoid=50844)(4rows)

在服务端打开rowidexpr_tidscan选项后达到预期:

postgres=# explain execute stmt('nMYAAA==5sAAAA==gAA=');QUERYPLAN---------------------------------------------------------Tid Scanontab1(cost=0.01..4.02rows=50000width=36)TID Cond:(rowid=($1)::rowid)(2rows)

JDBC使用pbe方式如果没开那个选项,PBE方式会走全表扫。

GUC参数非全局设定

哪些GUC参数能使用set进行局部配置,而非cluster全局范围生效呢?

可以使用SET在user、database进行设置,有三种设置形态:

alteruserset...alterdatabaseset...alteruserindatabaseset...

但数据库里并非所有的参数都能使用set在session范围进行设置,否则可能会遇到

  • xxx cannot be changed now
  • xxx cannot be set after connection start

这类错误提示,而当前数据库内核哪些参数可以设置,我们可以使用如下代码提前了解:

DOLANGUAGEplpgsql $do$declarev_rec record;v_sqlvarchar;beginforv_recinselect*frompg_settingswherecontextnotin('internal','postmaster')loopbeginv_sql='alter database postgres set '||v_rec.name||'='||quote_literal(v_rec.setting)||';';executev_sql;raise notice'%',v_rec.name;exceptionwhenothersthen--raise notice 'state=%,error=%',SQLSTATE,SQLERRM;end;endloop;end;$do$;

分布式场景hash分区键问题

openGauss系分布式扩缩容时遇到一个问题,分析定位与分区表hash分区键类型有关。

  • 分区表使用普通的create table方式,hash分区支持分区键支持浮点数类型或时间类型。
  • 分区表使用create table including方式,hash分区分区键只支持整型。

测试语句如下:

  • 普通的create table方式可以成功
createtabletest1(idintegernotnull,widdecimal(4,4))DISTRIBUTEBYHASH(id)PARTITIONBYHASH(wid)(PARTITIONp1,PARTITIONp2,PARTITIONp3);createtabletest2(idintegernotnull,sincetimestamp)DISTRIBUTEBYHASH(id)PARTITIONBYHASH(since)(PARTITIONp1,PARTITIONp2,PARTITIONp3);

test1表的hash分区键为浮点类型,test2表的hash分区键为时间类型。

  • create table including方式失败
CREATETABLEtmp1(LIKEtest1 INCLUDING DISTRIBUTION INCLUDINGPARTITION);CREATETABLEtmp2(LIKEtest2 INCLUDING DISTRIBUTION INCLUDINGPARTITION);

复制test1表分区键类型为浮点型时,tmp1表创建失败,报错:

ERROR:numericfield overflow

复制test2表分区键类型为时间类型时,tmp2表创建失败,报错:

ERROR: invalid input syntaxfortypetimestamp:"2"

这次的分享就到这里,后续会继续分享~

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/1 17:20:05

12月26日,历经近10年系统性修缮的养心殿再度揭开神秘面纱,这里是封建时代皇权的中心,曾经发生过很多影响中国历史的重大事件!

养心殿位于乾清宫西侧,西六宫迤南,始建于明代嘉靖十六年(1537年)。 2015年,养心殿研究性保护项目启动,经过为期10年的系统性修缮保护,恢复并延续了养心殿区域的健康状态,改善了室内…

作者头像 李华
网站建设 2026/3/1 11:03:53

清华镜像源加速PyTorch-CUDA-v2.7下载,十分钟搞定环境

清华镜像源加速PyTorch-CUDA-v2.7下载,十分钟搞定环境 在深度学习项目启动阶段,最让人抓狂的不是模型调参,而是环境搭建——尤其是当你面对“pip install torch”卡在10%、CUDA版本不匹配报错、或者GPU死活识别不了的时候。这种低效不仅拖慢开…

作者头像 李华
网站建设 2026/2/26 11:46:31

程序员就业城市全攻略:最新

对于程序员来说,选对就业城市堪比第二次“高考”。它不仅决定了你每月的薪资条厚度,更影响着技术成长速度、职业天花板高度,甚至是生活幸福感。有人在一线城市拿着高薪却困在出租屋,有人在新一线城市实现薪资与生活的双赢。 结合最…

作者头像 李华
网站建设 2026/2/28 12:54:28

一文搞懂!RAGFlow 入门教程与安装部署全流程

一、RAGFlow介绍 RAGFlow 是一款基于深度文档理解构建的开源 RAG(Retrieval-Augmented Generation)引擎。RAGFlow 可以为各种规模的企业及个人提供一套精简的 RAG 工作流程,结合大语言模型(LLM)针对用户各类不同的复杂…

作者头像 李华
网站建设 2026/3/1 13:21:14

全面掌握 AI 智能体 30 个高频面试的问题与解答相关的核心知识点

AI 智能体在现代自动化与智能系统中扮演的角色越来越重要,掌握其设计、部署与协作机制的专业人才也日益走俏。无论你是准备面试,还是希望深入了解这个前沿领域,扎实掌握智能体的核心知识都是必不可少的。 本文汇总了 30 个关于 AI 智能体&…

作者头像 李华
网站建设 2026/3/2 5:18:37

PyTorch-CUDA-v2.7镜像SSH远程连接教程,支持团队协作开发

PyTorch-CUDA-v2.7 镜像 SSH 远程连接与团队协作开发实践 在现代 AI 工程实践中,一个常见的痛点是:为什么同一个模型代码,在研究员的机器上训练正常,到了工程师的环境却报错 CUDA not available? 或者更糟——“在我本…

作者头像 李华