PostgreSQL兼容性最强的国产数据库居然是...

最近看到数据库圈子内很多朋友都在宣传PostgreSQL,不可否则,这几年PostgreSQL在国内还是比较火,相反MySQL似乎大家宣传的还少一些了。

老实说我个人对PostgreSQL没有太大的好感,虽然知道PostgreSQL功能很强大,用过一段时间,总感觉用起来比较别扭。当然,可能根本原因还是自己不太熟。

这几年主要研究国产数据库多一些,在我们这么多的国产化改造客户中来看,实际上PostgreSQL的比例是比较低的,目前也就能源、医疗、制造业行业客户有在少量使用。

首先我要说的是国产数据库这么多种,实际上有不少都是基于PostgreSQL的,这其中有完全套壳的,也有基于PostgreSQL去魔改的,具体的名字就提了,我相信很多网友都知道了。 要说For PG 兼容性,MogDB 其实做的点很多了,这类我挑选一部分供大家参考。

兼容PostgreSQL scroll属性

MogDB 5.0版本在A模式或PG模式,可以对游标指定SCROLL属性,使其可用于倒序方式检索数据行(即反向检索)。

alt

兼容PostgreSQL 表级logged/unlogged属性

默认logged属性的表有WAL写保护,不会有数据丢失的风险。不过unlogged属性的表不记录WAL性能更高,不同场景用户可以灵活选择,进行切换使用。 MogDB 5.0版本在PG兼容模式下支持在线切换表的logged/unlogged属性,并且同时兼容两种用法,且与PostgreSQL操作一样。

CREATE TABLE tab1 (...);
ALTER TABLE tab1 SET UNLOGGED ;
ALTER TABLE tab1 SET LOGGED ;

不过这里需要注意的是,unloged操作类似Oracle中的nologging操作。根据我们过去的经验,nologging操作通常只在数仓或者一些测试环境中操作;主要是用于大数据量加载的速度提升。 由于只记录少量的日志,因此如果要进行数据恢复,可能就没戏了。

WITH语句兼容更多场景保持不物化

WITH语句也是Common table expressions (CTEs),可以把大的复杂查询分解为简小的片段,从而更易阅读和理解,同时使用WITH语句可以“物化”缓存多次重复的计算,降低冗余子查询及函数的副作用。

在PostgreSQL 12之前WITH语句默认是保持物化的行为,但物化行为也可能会引起执行变慢。PostgreSQL 12对WITH语句提供了MATERIALIZED/NOT MATERIALIZED的选项,同时默认行为改变为保持不物化。

MogDB 5.0版本保持兼容了这一行为,并对一些复杂场景,例如子查询内部被引用时,仍可保持不物化行为,使其可以被提升到上层查询,生成更优查询计划,以提升执行性能。

alt

兼容PostgreSQL upsert语法

upsert相当于insert + update的组合,当数据行insert操作发生主键或唯一约束重复时,可触发update操作或者忽略不报错。

MogDB5.0新增兼容性里面除了支持兼容Oracle的语法之外,同时新增了兼容PostgreSQL的upsert语法能力:

--示例1
create table test_upsert (id int primary key,code varchar unique,info varchar);

insert into test_upsert (id,code,info) 
    values (1,'code1','info');

insert into test_upsert (id,code,info) 
    values (1,'code1','info extra1'
    on conflict(id) 
    do update set info=excluded.info,id=excluded.id;

insert into test_upsert (id,code,info) 
    values (1,'code1','info extra2'
    on conflict(id) 
    do update set info=excluded.info,code=excluded.code;


--示例2

create table test_upsert2 (
    id int primary key,
    code1 varchar not null,
    code2 varchar not null,
    info varchar,
    unique(code1,code2)
);

insert into test_upsert2 (id,code1,code2,info) values (1,'openGauss','MogDB','info');


insert into test_upsert2 (id,code1,code2,info) 
    values (1,'openGauss','MogDB','db extra1'
    on conflict(code1,code2) 
    do update set info=excluded.info, 
                  id=excluded.id,
                  code1=excluded.code1;

test_upsert2表里使用了多字段唯一索引,下面upsert语句可以指定冲突的条件是unique(code1,code2),
而非主键id,同时在update子句也可对主键id或组合唯一索引的部分字段code1进行操作。

实际上除了这些小的点,还有很多;当然我个人也没有去完整里的梳理过,后续MogDB 5.2版本发布之后,我们会有更加完整的兼容性梳理(For Oracle、For MySQL以及For PostgreSQL)。

这里我给大家分享一个我们今年做的一个PostgreSQL到MogDB 5.0的改造case。 该用户源端数据库是PostgreSQL 12.4版本。

alt
alt
alt

大家可以看到,实际上这个系统数据量还是很大的,表也比较多,接近4000个表,虽然存储过程这些几乎没有,但并不代表这个系统不复杂,不重要;相反这个系统是核心系统之一。

如果要说使用PG非常重要的系统,那么无疑就是鼎捷了,鼎捷ERP目前其中一个关键产品线使用的是MogDB,目前已经上线了很多客户了。

本文由 mdnice 多平台发布

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

高通安卓12-在源码中查找应用的方法

1.通过搜索命令查找app 一般情况下,UI上看到的APP名称会在xml文件里面定义出来,如 搜索名字为WiGig的一个APP 执行命令 sgrep "WiGig" 2>&1|tee 1.log 将所有的搜索到的内容打印到log里面 Log里面会有一段内容 在它的前面是这段内…

计算机网络(概述)

该笔记为湖科大计算机网络相关笔记、教材参考计算机网络第六版 湖科大计算机网络 计算机网络概述 因特网概述 Internet和internet的区别 internet:只要是计算机与计算机连接,形成了网络,就可以叫internet Internet:泛指全世界的…

Excel 组内多列明细拼成一行

某表格有 1 个分组列和 2 个明细列。 ABC1ObjectNameInfo212AGggtz44456312AGggtr99987412AKkkio66543512ABbvgf66643612AVvvhg888765712AFffgt8786FGggtf23232596FXxxde44321610P23Cccvb554328711P23Vvvbj565656412P23Sswec898976413P23Llloiu343432 现在要把组内的多列明细…

分解数据堆栈:存储和计算 2.0 的分解

在LinkedIn上,有一篇优秀的帖子在数据和数据库人群中流行。它由 Theory VC 合伙人 Tomasz Tunguz 撰写,讲述了我们自 2019 年以来讨论的趋势。 数据库正在成为高速查询引擎,并正在抛弃存储。这并不意味着存储不重要,相反&#xf…

蔚来汽车AI算法工程师,如何理解注意力?

大家好啊,我是董董灿。 今天分享一个上海蔚来汽车的AI算法岗位面试经验总结帖,面试岗位为算法工程师。 这次面试提到的问题,除了与实习相关内容和反问之外,面试官总共问了8个问题,主要集中在深度学习基础概念的理解上…

Python发送HTML邮件有哪些步骤?怎么设置?

Python发送HTML邮件如何实现?Python发送邮件的策略? HTML邮件不仅可以包含丰富的文本格式,还可以插入图片、链接和其他多媒体内容,从而提升邮件的美观性和功能性。AokSend将详细介绍Python发送HTML邮件的主要步骤,帮助…

C++ | Leetcode C++题解之第172题阶乘后的零

题目: 题解: class Solution { public:int trailingZeroes(int n) {int ans 0;while (n) {n / 5;ans n;}return ans;} };

Vue75-路由传参3

一、在index.js中使用props参数 1-1、写法一:值为对象 此时,参数是固定写死的,不推荐! 1-2、值为布尔值 此时只能收到params中的参数! 1-3、值为函数 (最强大) 二、小结

微信小游戏提审失败,小游戏内容涉嫌代码包内容侵权的解决方案

仅讨论正常开发提审遇到的问题,不适用于马甲包 前阵子提审了一款RPG游戏,因为游戏之前已经通过审核,这次发布的仅是一个小更新(十几行代码的样子),结果也莫名其妙未通过审核,理由如下&#xff…

github连接报本地

一、创建GIthub账号 这里默认大家已经创建好了并且有加速器,能正常上网,然后才能进行下面的操作。 二、创建ssh公钥 网址:Sign in to GitHub GitHub Sign in to GitHub GitHub 进入下面的界面: 然后创建新的密钥 三、官方文…

HarmonyOS Next 系列之沉浸式状态实现的多种方式(七)

系列文章目录 HarmonyOS Next 系列之省市区弹窗选择器实现(一) HarmonyOS Next 系列之验证码输入组件实现(二) HarmonyOS Next 系列之底部标签栏TabBar实现(三) HarmonyOS Next 系列之HTTP请求封装和Token…

Hive笔记-5

240619-Hive笔记-5 6.2.2 全表和特定列查询 1) 全表查询 hive (default)> select * from emp; select 查看你要查看的信息 from 你要从哪张表里面查 2) 选择特定列查询 hive (default)> select empno, ename from emp; 注意: (1&#xff0…

qt开发-08_layout 布局

Qt 提供了非常丰富的布局类,基本布局管理类包括:QBoxLayout、QGridLayout、QFormL ayout 和 QStackedLayout。这些类都从 QLayout 继承而来,它们都来源于 QObject(而不是 QWi dget)。创建更加复杂的布局,可…

python18 正则表达式

python18 正则表达式 正则表达式 re.match(),re.search(),re.findall(),re.sub(),re.split() 元字符 具有特殊意义的专用字符 导入模块 improt re代码 正则表达式 re.match(),re.search(),re.findall(),re.sub(),re.split() 元字符 具有特殊意义的专用字符 导入模块 improt rei…

两种单例模式(保证线程安全)

开始前,球球各位读者给个三连吧,有错误感谢指出,谢谢 单例模式也叫单个实例,也就是这个类只有且只能有一个实例对象,这样一个类就叫做“单例”;单例模式有很多种,这里只介绍“饿汉模式”和“懒…

抖音商城618好物节消费数据报告发布,带货成交额同比增长300%

6月21日,“抖音商城618好物节”消费数据报告发布,呈现618期间平台全域经营情况及大众消费趋势。 今年618大促活动中,抖音电商投入流量资源和消费券,鼓励商家、达人双向经营货架场景和内容场景,不断激活消费市场。 报…

202406最新manjaro安装sogou输入法解决方案(采用aur本地package+sogou deb包解决方案)

本地执行安装方法 1.拉取源码 git clone https://gitee.com/liushuai05/fcitx-sogoupinyin.git cd fcitx-sogoupinyin 2.获取sogou下载地址并替换到源码中 - 下载地址:https://pinyin.sogou.com/linux/ - 点击立即下载->x86_64->下载,然后右键复…

超级管道,品质非凡——钢塑复合管

钢塑复合管,是一种新型的复合管材,又叫涂塑钢管,涂塑钢管有内涂塑钢管,外涂塑钢管,内外涂塑钢管,外镀锌内涂塑钢管,外3pe防腐内涂塑钢管等。 它结合了钢管和塑料管的优点,具有高强度…

Python学习路线

Python学习路线 领取资料 一、Python基础知识 Python入门:了解Python的安装方法、如何运行Python程序以及交互模式的使用,同时学习注释的添加方法。 数据类型:掌握Python中的各种数据类型,包括数字、布尔值、字符串、列表、元…

Golang笔记:使用serial包进行串口通讯

文章目录 目的使用入门总结 目的 串口是非常常用的一种电脑与设备交互的接口。这篇文章将介绍golang中相关功能的使用。 本文使用的包为 :go.bug.st/serial https://pkg.go.dev/go.bug.st/serial https://github.com/bugst/go-serial 另外还有一些常见的包如&…