• [技术干货] 将PostgreSQL插件移植到openGauss指导
    1 概述PostgreSQL社区提供了丰富的插件,但由于openGauss和PostgreSQL存在一定的差异,如线程/进程模型、系统表和视图等,无法直接为openGauss所用,不可避免的需要在插件上做整改。本文档主要对PostgreSQL插件移植到openGauss的过程提供指导说明,旨在让开发人员对PG插件所需要的修改有一个具体的了解,基于该文档,可基本实现PG插件移植到openGauss。2 约束由于openGauss与PostgreSQL在内核上存在不少差异,这篇文档未能覆盖所有这些差异,因此仅依赖该文档有可能无法实现PG插件的完全迁移,部分差异需要开发者深入内核源码识别,然后可将识别出来的差异补充到该博客的第9章对应小节的表格中(博客对应的gitee地址: https://gitee.com/opengauss/blog/blob/master/content/zh/post/chenxiaobin/,具体操作可见blog仓库的将PostgreSQL插件移植到openGauss指导.md ),有任何问题可在博客下方留言讨论。3 移植步骤1) 将PG插件的代码拷贝到openGauss源码的contrib目录下2) 配置环境变量,需要将数据库的bin和lib加在操作系统的环境变量PATH和LD_LIBRARY_PATH中3) 到插件目录下,执行make && make install,编译安装插件。4) 编译成功后,到数据库中执行create extension extension_name即可使用。通常步骤3和4不会直接成功,需要一些必须的修改。下面分类别说明移植PG插件所需要做的修改。4 Makefile文件1) 当前有两种方式支持插件编译,一种是依赖源码编译,一种是用pgxs的方式编译,支持插件在一个已经安装的数据库服务上进行编译。建议选择前者的方式,如果采用后者,需要定义USE_PGXS,但是可能出现部分头文件找不到的问题,这时候需要到源码拷贝头文件到目标目录。ifdef USE_PGXS PG_CONFIG = pg_config PGXS := $(shell $(PG_CONFIG) --pgxs) include $(PGXS) else subdir = contrib/pg_freespacemap top_builddir = ../.. include $(top_builddir)/src/Makefile.global include $(top_srcdir)/contrib/contrib-global.mk endif2) -fPIC 作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code)。使用-fPIC,可以使得动态库可以被多个程序共享。不加fPIC加载的so,要在加载时根据加载到的位置再次重定位。override CPPFLAGS :=$(filter-out -fPIE, $(CPPFLAGS)) -fPIC5 类型转换1) ANSI C规定,void指针可以复制给其他任意类型的指针,其他任意类型的指针也可以复制给void指针,他们之间复制不需要强制类型转换。但是c++不支持,需要做强制类型转换。buffer = palloc(MAX_LINESIZE); -> buffer = (char*)palloc(MAX_LINESIZE);2) 部分c++编译器不支持const char*到char*的隐式转换,需要做强制类型转换。6 函数声明1) C语言中并没有重载和类这些特性,编译出的符号与C++不同,例如print(int i),不会被编译为_print_int,而是直接编译为_print等。因此如果直接在C++中调用C的函数会失败,例如调用print(3),c++中实际上会去找_print_int(3),这样就会找不到。加上extern “C”,指示编译器这部分代码按C语言来进行编译,而不是C++。extern PGDLLEXPORT Datum orafce_to_char_timestamp(PG_FUNCTION_ARGS); -> extern "C" PGDLLEXPORT Datum orafce_to_char_timestamp(PG_FUNCTION_ARGS);可以通过nm -D so文件查看生成的符号。7 安全函数整改1) 推荐使用安全函数(可见securec.h),并对安全函数的返回值作检查,openGauss定义了几个常用的检查宏,如下。#define check_memcpy_s(r) securec_check_c((r), "", "") #define check_memmove_s(r) securec_check_c((r), "", "") #define check_memset_s(r) securec_check_c((r), "", "") #define check_strcpy_s(r) securec_check_c((r), "", "") #define check_strncpy_s(r) securec_check_c((r), "", "") #define check_strcat_s(r) securec_check_c((r), "", "") #define check_strncat_s(r) securec_check_c((r), "", "") #define check_gets_s(r) securec_check_ss_c((r), "", "") #define check_sprintf_s(r) securec_check_ss_c((r), "", "") #define check_snprintf_s(r) securec_check_ss_c((r), "", "") #define check_scanf_s(r) securec_check_ss_c((r), "", "")下面是安全函数整改的示例。memcpy(d, u, clen); -> check_memcpy_s(memcpy_s(d, strlen(d), u, clen));为了方便和完全地作安全函数整改,这里提供一个查找危险函数的正则表达式。(wmemcpy\()|(wmemove\()|(memmove\()|(wcscpy\()|(wcsncpy\()|(strcat\()|(wcscat\()|(strncat\()|(wcsncat\()|(strtok\()|(wcstok\()|(sprintf\()|(swprintf\()|(vsprintf\()|(vswprintf\()|(snprintf\()|(vsnprintf\()|(vsnprintf_truncated\()|(snprintf_truncated\()|(scanf\()|(wscanf\()|(vscanf\()|(vwscanf\()|(fscanf\()|(fwscanf\()|(vfscanf\()|(vfwscanf\()|(sscanf\()|(swscanf\()|(vsscanf\()|(vswscanf\()|(gets\()|(strcpy\()|(strcpy\()|(strncpy\()|(strncpy\()|(strcat\()|(strncat\()|(memcpy\()|(memcpy\()|(memset\()|(memset\()8 变量转换1) 对比PostgreSQL,openGauss收集了原有的全局变量,将其收集在了g_instance、t_thrd、u_sess(分别是全局变量、线程变量和会话变量)等结构体内,因此需要作相应替换(通过编译报错体现,需要到内核代码层面查看变量具体存放位置)。插件的全局变量可通过nm -D so | grep ‘B’排查。(具体见7.7)econtext = error_context_stack; -> econtext = t_thrd.log_cxt.error_context_stack;2) PG采用进程模型,用户会话进来时会创建一个独立的进程去处理,此时插件定义的全局变量在该进程内就是唯一的会话变量。而openGauss采用线程模型,所有会话共享同一份全局变量,因此需要将全局变量修改为会话变量。对于只读的全局变量,保持原样即可,而对于多次修改的变量,需要作如下修改。a. 如果不考虑在线程池模式下使用插件,将全局变量修改为THR_LOCAL变量,即线程变量,因为用户会话进来会创建一个独立的线程。b. 如果需要线程池,就需要作额外的修改。线程池模式下,一个用户会话可能会切换多个线程,单纯的将全局变量改为线程变量,在切换线程时会丢失对该变量的修改。openGauss提供了插件自定义会话变量的方式,具体实现如下。(以dblink为例)内核侧在u_sess中定义一个指针数组extension_session_vars_array,和标识数组大小的变量extension_session_vars_array_size,数组用于存放插件会话变量的结构体。   typedef struct knl_session_attr_common { … uint32 extension_session_vars_array_size; void** extension_session_vars_array; } knl_session_attr_common;插件侧需定义一个全局的下标变量,用于获取数组元素,并且提供set_extension_index函数,内核侧会调用该函数来设置下标。示例如下。static uint32 dblink_index; void set_extension_index(uint32 index) { dblink_index = index; }此外,插件侧还需要定义步骤1提到的会话变量结构体,存放该插件自身所有的会话变量,以及提供函数init_session_vars,主要是初始化该结构体,并把指针存放在数组的对应下标位置。示例如下。#include "commands/extension.h" typedef struct dblink_session_context { remoteConn* pconn; HTAB* remoteConnHash; } dblink_session_context; void init_session_vars(void) { RepallocSessionVarsArrayIfNecessary(); dblink_session_context* psc = (dblink_session_context*)MemoryContextAllocZero(u_sess->self_mem_cxt, sizeof(dblink_session_context)); u_sess->attr.attr_common.extension_session_vars_array[dblink_index] = psc; psc->pconn = NULL; psc->remoteConnHash = NULL; }最终,在插件使用会话变量时,根据下标到数组中获取对应的结构体指针即可。dblink_session_context* get_session_context() { if (u_sess->attr.attr_common.extension_session_vars_array[dblink_index] == NULL) { init_session_vars(); } return (dblink_session_context*)u_sess->attr.attr_common.extension_session_vars_array[dblink_index]; } void example() { remoteConn* pconn = get_session_context()->pconn; }具体方案实现可见社区PR(https://gitee.com/opengauss/openGauss-server/pulls/1101),插件整改可参考其中对dblink的整改。9 其他除了上述修改点,还存在很多一些较为细节的地方,其中包括有C和C++的差异,例如在C++中new关键字不能作标识符等;大多数还是openGauss和PostgreSQL内核上的差异,下文会对这些差异作详细说明。此外,有些插件可能是基于PG内核新特性开发的,openGauss并不支持,可以考虑将特性整合到插件,必要时修改内核。下面列举openGauss和PostgreSQL(REL_13_STABLE)内核上的差异,第2章中提到该部分需要不断更新完善,目前仅列出极少部分。9.1 API序号API_01PostgreSQLvoid table_close(Relation relation, LOCKMODE lockmode);openGauss#define heap_close(r,l) relation_close(r,l) void relation_close(Relation relation, LOCKMODE lockmode);作用close any relation差异名称不同序号API_02PostgreSQLRelation table_open(Oid relationId, LOCKMODE lockmode)openGaussRelation heap_open(Oid relationId, LOCKMODE lockmode, int2 bucketid=-1);作用open a heap relation by relation OID差异名称不同;openGauss的heap_open增加了一个可选参数bucketid9.2 系统表序号SYSTAB_01系统表pg_class差异openGauss新增字段:reltoastidxid, reldeltarelid, reldeltaidx, relcudescrelid, relcudescidx, relhasoids, relhaspkey, relcmprs, relhasclusterkey, relrowmovement, parttype, relfrozenxid64, relbucket, relbucketkeyPostgreSQL 新增字段:relrowsecurity, relforcerowsecurity, relispopulated, relispartition, relrewrite , relminmxid , relpartbound relkind字段可选值差异:PostgreSQL中用p和I表示分区表和分区索引,openGauss用字段parttype表示。备注具体描述可见《开发者指南》-系统表和系统视图-系统表-PG_CLASS9.3 系统视图序号SYSVIEW_01系统表pg_tables差异openGauss新增字段:tablecreator, created, last_ddl_time PostgreSQL 新增字段:rowsecurity备注具体描述可见《开发者指南》-系统表和系统视图-系统视图-PG_TABLES9.4 系统函数9.5 LOCK9.6 Memory Context9.7 全局变量PostgreSQLopenGauss作用域error_context_stackt_thrd.log_cxt.error_context_stackThreadWalSndCaughtUpt_thrd.walsender_cxt.walSndCaughtUpThreaddisable_costg_instance.cost_cxt.disable_costInstancecpu_tuple_costu_sess->attr.attr_sql.cpu_tuple_costcpu_tuple_cost10 常见错误信息1) 编译安装时报错:dangerous relocation: unsupported relocation解决方法:参考4.2,在Makefile中添加下面一句。override CPPFLAGS :=$(filter-out -fPIE, $(CPPFLAGS)) -fPIC2) 编译安装时报错:error: invalid conversion from ‘void’ to ‘char’ [-fpermissive]解决方法:参考5类型转换3) create extension时报错:could not find function “xxx” in file “xxx.so”解决方法:参考6函数声明。
  • [技术干货] 直播预告 | 12月30日,openGauss与PostgreSQL核心技术解读及优势对比
    直播时间 12月30日 14:00—15:30 由Gauss松鼠会联合墨天轮、openGauss社区共同主办的专题分享之:“openGauss与PostgreSQL核心技术解读及优势对比” 将于本周四(12月30日)震撼登场。活动详情PostgreSQL 全球开发组于 2021-05-20 发布了 PostgreSQL 14 的第一个 beta 版本且目前已经提供了下载。最新版本的PostgreSQL的更新主要体现在负载情况下的性能优化,增加了数据类型和SQL,增强信息监控能力,逻辑复制的性能以及安全方面的强化。而作为基于PostgreSQL而开发的国产数据库领军产品openGauss也在今年9月30日发布了2.1.0的最新版本。市面上对于PostgreSQL及openGauss之间的对比及讨论一直非常热烈。openGauss毫无疑问在很多方面,尤其是内核增强上,规避了PostgreSQL出现的很多问题,但是相比较老牌的数据库产品,也有很多不足和需要继续进步的地方。活动主题本次直播将针对openGauss及PostgreSQL 进行核心技术的解读与对比,从专业的角度来分析双方产品的核心技术以及自身优势,同时也包括对于数据库国产化发展及生态构建的展望。直播福利本次直播给大家准备了超多精美礼物!届时进入直播间即有机会领取!礼物包括:墨天轮定制黑胶晴雨伞墨天轮定制款蓝牙耳机Gauss松鼠会保温杯Gauss松鼠会无线充电宝套装《openGauss数据库核心技术》 活动嘉宾大会议程扫码立即报名扫描二维码或点击文末“阅读原文”即可报名小伙伴们行动起来吧与大咖对话的机会千万别错过~- END -阅读原文
  • [问题求助] Postgresql性能优化求指点
    有进展了,谢谢。
  • [技术干货] 我使用DRS同步MySQL Float类型数据到PostgreSQL,为什么两边数据"不一致"
    最近收到一个客户反馈使用DRS同步后,源库和目标库的数据不一致。数据一致性是DRS的生存之本,团队上下非常重视,收到反馈后马上联系客户了解情况排查原因,最终发现原来是虚惊一场。那么这个“不一致”是怎么产生的?它底层的根本原因又是什么呢?接下来我们一起来挖一挖。 ### 问题现象 客户使用DRS创建了MySQL到PostgreSQL的同步任务,MySQL表中存在一个FLOAT类型的列,DRS任务启动后会在PostgreSQL中对应创建一个FLOAT4的列。同步过程中在MySQL中插入一条FLOAT列值为3.1415926的数据,同步后在源库MySQL中SELECT出来的数据是3.14159,而在目标库PostgrSQL中SELECT出来却是3.1415925。 ### 复现步骤: 1. 在源库建表: ``` CREATE TABLE `float_test` ( `id` int(11) primary key, `id2` float ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ``` 2. 创建DRS任务,同步这张表的数据到PostgreSQL。目标库会自动创建下表: ``` CREATE TABLE "root"."float_test" ( "id" int PRIMARY KEY, "id2" FLOAT4 ) ``` 3. 在源库insert数据: ``` insert into `float_test` values (1, 3.1415926); ``` 4. 数据同步之后 通过mysql客户端查询: ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202110/30/212544xwlhjzvltsvzwq3e.png) 通过postgresql客户端查询: ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202110/30/220225tpxlepjbgjhm6sgi.png) 而通过jdbc查询: mysql: ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202110/30/220318ok6xwp6d82fzlwr3.png) postgresql: ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202110/30/220331oolheuirfknpihww.png) ### 问题原因: mysql底层存储3.1415926的时候,binlog中记录的数据为3.1415925,DRS从binlog中解析出来数据,同步到PostgrSQL的也是3.1415925。 而通过mysql的driver进行select的时候,mysql driver对数据进行了截断,所以查出来是3.14159,而PostgrSQL的driver没有进行截断,导致通过两种driver select出的数据不一致。 如果不想让driver截断,可以在jdbc的url中增加useServerPrepStmts=true的option。
  • [问题求助] 【鲲鹏920产品】【Postgresql功能调优】性能问题分析热点函数
    运行TPCC,perf top 发现热点函数为tts_buffer_heap_getsomeattrs10%ExecInterpExpr 7%ExecParallelHashTableInsert 6%网上未找到相关联的参数能将热点函数消掉,特来鲲鹏论坛求助解答谢谢
  • [问题求助] mycat配置postgresql数据源报驱动不对如何解决?
    mycat做分库处理,后端数据源是postgresql-10,按照华为云文档,安装arm的java,同时增加startup_nowrap.sh文件的JAVA_HOME变量,在启动mycat时还是提示JDBCHeartBeat error java.sql.SQLException: No suitable driver found for jdbc:postgresql://192.168.0.228:5432/xxx,如图: 同时,我们买了带有MYCAT公共镜像的ECS,还是报一样的错,请问是ARM没有mycat对PG的支持吗?因为在X86上是可以的
  • [问题求助] 购买RDS postgresql怎么用navicat连接
    购买了RDS PostgreSQL增强版,这个数据库我想通过我本地电脑的Navicat 连接看一下配置,怎么去操作
  • [DevKit] 【Hyper Tuner调优实践12】基于系统性能分析工具的PostgreSQL调优实践
    1      调优介绍使用HyperTuner系统性能分析工具对PostgreSQL所在系统执行系统全景分析,找到性能瓶颈点,并根据分析结果进行优化修改,从而实现PostgreSQL系统的性能增强。2      组网环境项目说明服务器TaiShan 200 服务器(型号2280)CPUKunpeng 920OSCentOS 8.0应用postgres (PostgreSQL) 11.3调优工具HyperTuner 2.2.T4压力测试工具pgbench (PostgreSQL) 11.3 3      前提条件服务器和操作系统正常运行。PC端已经安装SSH远程登录工具。PostgreSQL数据库环境上HyperTuner工具已经安装完成,并正常运行。PostgreSQL数据库已经安装完成,并启动,并准备2000W条数据。压力测试工具pgbench正常运行。 4      调优思路在进行调优之前,先用pgbench工具测试PostgreSQL运行8个客户端8个线程的性能数据。使用HyperTuner系统性能分析工具针对PostgreSQL应用从全景分析维度进行性能分析,并根据性能分析结果得出性能瓶颈点以及优化方法。针对性能瓶颈点分别进行性能优化。完成优化后,再用pgbench工具测试PostgreSQL运行8个客户端8个线程的性能数据,与调优之前的性能进行对比,判断性能是否有提升。5      操作步骤5.1      调优前数据库性能测试1.运行pgbench程序    执行压测命令pgbench -M prepared -r -c 8 -f /home/test/login.sql -j 8 -n -T 30 -h 127.0.0.1 -p 5432 -U postgres postgres,查看tps和statement latencies in milliseconds 2.执行系统全景性能分析 创建系统全景分析任务,配置参数如下图   查看系统性能指标 从tps参数值中,可以看到sda的tps值为854.75,设备的带宽使用率超过基准值,触发优化建议:磁盘I/O存在问题,建议更换高性能硬盘或检查进程是否有可优化的读写操作。5.2      优化方法1.开启PostgreSQL的异步提交日志,修改PostgreSQL配置文件,执行vim /data/pgsql/postgresql.conf 命令编辑配置文件。    synchronous_commit = off    wal_writer_delay = 10ms2.切换postgres用户,执行重启PostgreSQL命令,使配置文件生效。/usr/local/pgsql/bin/pg_ctl -D /data/pgsql -l logfile restart5.3      调优后测试1.创建全景分析任务 2.运行Pgbench,执行压力测试数据库tps从793提升至3276,INSERT和UPDATE的语句延时从5.804ms和4.105ms降低至1.1359ms和0.955ms,性能有所提升。3.查看系统性能指标 系统tps从854提升至1176,设备的带宽使用率降低,未触发优化建议 6      调优结果分析  本实践中,经过对PostgreSQL参数进行了调优后,从pgbench性能和系统性能指标可以看出,性能有所提升。
  • [问题求助] GaussDB和PostgreSQL的区别在哪里?
    GaussDB和PostgreSQL的区别在哪里?
  • [数据库] 【Postgresql移植】【CRC检验算法】AArch64平台如何使用__crc32cb/cw/cd/ch
    postgresql移植指南中,关于AArch64平台(src/port/pg_crc32c_armv8.c)中描述的“使用__crc32cb/cw/cd/ch”的具体操作方法
  • [技术干货] 阿里李飞飞5月底发布的PolarDB for PostgreSQL直接针对OpenGauss,华为只能跟上
    上个帖子乏人问津,只好自己再说几句。纯粹的性能驱动的数据处理市场已趋于饱和,未来市场的发展方向更多的将是功能和性价比驱动。最能适应未来市场的数据平台将会是云上的全球分布的HTAP数据库,它将结合MPP数据库的并发计划并发执行技术与New SQL的基于时钟的全球分布部署能力和基于共识协议的高可靠模块,能在全球部署下支持HTAP应用,做到One size fits most。典型应用是用以替换原有的单机或集群TP系统,以本地TP为主,分布TP为辅,并增加分布AP能力,可直接访问分布的数据无需ETL。上述构架的优点是在单一系统内,以尽可能小的成本满足绝大多数客户的多样的数据处理需求。阿里云5月底发布的PolarDB for PostgreSQL正是这样的体系,并且直接针对OpenGauss。在数据库国产替换的潮流下将之开源是为了抢夺客户,纯TP的OpenGauss将没有多少竞争能力,华为要想不被彻底甩开,只有跟进同样的构架。所幸现有一条终南捷径,那就是将成熟的基于PostgreSQL的YugabyteDB上的基于混合时钟HLC的分布事务处理模块和基于Raft的HA移植到现有的分布PostgreSQL上。
  • [技术干货] PostgreSQL 高质量学习交流网站及链接推荐
    在学习和使用PG过程中,经常会翻阅一些资料,现在我把在这个过程积累得一些高质量的链接分享给大家。如果大家发现很好的链接,也欢迎分享给我,从而改进。官方   =================官方:https://www.postgresql.org/官方仓库:https://git.postgresql.org/gitweb/planet PG:https://planet.postgresql.org/  包括Top posters、Top teams、Feeds、Planet官方wiki:https://wiki.postgresql.org/wiki/Main_PageWeekly News: https://postgresweekly.com/英文手册:https://www.postgresql.org/docs/中文手册:http://www.postgres.cn/docs/10/中文社区:http://www.postgres.cn/pgadmin:https://www.pgadmin.org/#pg大会:https://postgresconf.org/插件大全:https://pgxn.org/pg欧洲:https://www.postgresql.eu/commitfest: https://commitfest.postgresql.org/厂商   =====================openGauss:https://opengauss.org/zh/富士通: https://www.postgresql.fastware.com/  postgres pro: https://postgrespro.com/二象限:https://www.2ndquadrant.com/en/EDB:https://www.enterprisedb.com/Crunchy Data:https://www.crunchydata.com/PostgreSQL Internal :http://postgresintl.com/HeteroDB:http://heterodb.com/  PG-Strom插件,基于GPU和NVME,大数据处理Cybertec:https://www.cybertec-postgresql.com/时序数据库 timescale:https://docs.timescale.com/https://www.pipelinedb.com/  High-performance time-series aggregationhttps://www.citusdata.com/ 分布式shardinghttps://pgexercises.com/XL官网:https://www.postgres-xl.org/pganalyze:https://pganalyze.com/https://www.elephantsql.com/博客  =====================数据库周报:https://dbweekly.com/issues、二象限博客中心:https://www.2ndquadrant.com/en/blog/PG每周新闻 https://grantzhou.github.io/PostgreSQL-Weekly-News-1-9/Bruce Momjian博客(PG社区co-founder) https://momjian.us/ 最新资讯:http://depesz.com/专注PG数据库维护的一个小团队  https://dataegret.com/news-blog/开源关系型数据库PostgreSQL生态系列资源 https://github.com/liuyuanyuan/FantasticPostgres/internal Postgres:http://www.interdb.jp/pg/index.htmlhttp://postgresguide.com/https://blog.panoply.io/https://pgdba.org/SeveralNines:https://severalnines.com/database-bloghttps://blog.panoply.io/percona:https://www.percona.com/blog其它  =====================https://pgmodeler.io/ PG建模PGTune https://pgtune.leopard.in.ua/#/  参数优化小工具
  • [开发应用] GaussDB A 的默认数据库postgres可以修改么?
    【功能模块】数据库名称修改;问题描述:使用GaussDB A数据库用户omm登录, 使用gsql命令行修改的默认数据库postgres,提示有连接section正在使用,而连接使用gsql停止命令,停止不掉;问题1:请问默认数据库postgres是不可以修改的是么?问题2:使用数据库用户,我可以一直免密登录postgres,是么?期待专家的接疑,谢谢
  • [技术干货] 7天玩转PostgreSQL基础训练营学习分享
    活动贴:【打卡帖】0元限时学《7天玩转PostgreSQL基础训练营》,大奖等你来哦!课程链接:https://education.huaweicloud.com/courses/course-v1:HuaweiX+CBUCNXD048+Self-paced/courseware/fb989107b5ea4f368fb11447ea2d8b63/a75cf56dbace4384993b27d81160bd92/课程知识总结:7天玩转PostgreSQL基础训练营(一)7天玩转PostgreSQL基础训练营(二)7天玩转PostgreSQL基础训练营(三)7天玩转PostgreSQL基础训练营(四)7天玩转PostgreSQL基础训练营(五)7天玩转PostgreSQL基础训练营(六)7天玩转PostgreSQL基础训练营(七)
  • [技术干货] GaussDB相比PostgreSQL做了哪些内核优化:
    内核优化        1. 进程模型改为线程模型        2. 高可用架构增强        3. 使用etcd集群存储全局事务号        4. XID事务号从32位改为64位        5. GTM性能增强        6. 流复制增强
总条数:112 到第
上滑加载中