当前位置: 首页 > news >正文

PG与ORACLE的差距

首先必须是XID 64,一个在极端环境下会FREEZE的数据库无论如何都无法承担关键业务系统的重任的,我们可以通过各种配置,提升硬件的性能,通过各种IT管控措施来尽可能避免在核心系统上面临FREEZE的风险,不过并不是每个企业都能做得很好,作为一个通用数据库产品,我们面向的是各种技术能力的客户,他们都会把数据库用在企业的关键业务上,因此作为数据库厂商,我们必须要在PG中解决这个问题。PG社区这些年也在努力解决这个问题,俄罗斯POSTGRESQLPRO的企业版数据库已经上线了XID64,我想这个问题在可见的未来一定会圆满的解决。

其次,提高LWLOCK的效率,LWLOCK是解决PG数据库内存并发访问的问题的,和Oracle的LATCH十分类似。LWLOCK的效率高低决定了SQL执行的效率,LWLOCK的代码优化是提高数据库整体性能的关键工作,哪怕在LWLOCK的核心代码中减少一两条语句,都会带来数据库性能与稳定性的提升。PG数据库是学院派风范的数据库,在设计上还遵循了对象数据库的思路,因此在内部数据结构上有些繁琐,访问这些数据结构的成本也就相对较高,优化LWLOCK的代码实际上是在为这种带来较大额外开销的底层设计买单。

第三,提高SHARED_BUFFERS的访问效率,以便于采用大型数据库缓冲来减少DOUBLE BUFFERS的影响。如果在一个关键业务系统中,同样一条SQL两次执行速度可能会差很多,甚至差数倍,对于应用开发人员和企业业务人员来说都是一件挺头疼的事情,不过这种事情如果出现在PG数据库里,那是很正常的。这是因为double buffers引起的。数据库的IO不是直接IO,而是BUFFERED IO,因此PG数据库是需要依靠OS的IO BUFFER来为IO访问提速的。包括预读机制等,大多依靠操作系统。DOUBLE BUFFERS虽然让数据库的IO 变得更简单了,但是对于应用来说并不友好,甚至因为DOUBLE BUFFERS的存在,我们不敢把SHARED BUFFERS设置的太大,怕因为OOM导致进程被杀。提高SHARED BUFFERS的访问效率,要从两方面入手,一方面是对于SHARED BUFFERS的管理相关算法的优化,对于BUFFER HEAD,HASH 链表等的管理需要更加高效,在SHARED BUFFER的HASH BUCKET管理上,消除ASTORE带来的负面影响,更高效的访问SHARED BUFFER,减少因为热块冲突而导致的LWLOCK争用。另外一方面是改造IO子系统,全面引入DIO,采用自己的预读算法,更为充分高效地使用操作系统的物理内存。

第四,优化BACKEND异常退出时的RECOVERY,PG数据库中有一个十分头疼的老毛病,那就是BACKEND进程是不敢随便杀的,如果被杀的BACKEND进程带有未提交事务,那么数据库在RECOVERY的时候对整个数据库的影响是很大的。当然我们也可以通过在应用中针对这个问题优化代码来避开这个坑,不过能够从数据库角度来解决问题,那不是更好吗。当然,要想在发生类似问题时处理得像Oracle那么平稳并非易事,需要对PG数据库的核心做大量改造,PG数据库缺少类似Oracle shared Pool的机制,让这个问题的彻底解决变得有些困难。

第五,极致高可用。核心业务系统的目标肯定是极致高可用的。Oracle数据库这三十年的MAA做得越来越极致。我们无法确保某个数据库随时都是不出问题的,大多数核心业务系统也能够忍受分钟级的系统不可用,以及十分钟内的故障切换。证券交易类的系统是无法忍受这种不可用的,这种情况下只能通过应用系统层面去解决。另外电力调度系统也是如此,电力调度系统是依靠双系统热备的模式来解决高可用的问题的,主备系统都在做相同的业务处理,只是备用系统产生的调度指令不执行而已。除了这些系统外,大部分系统只要在数分钟内恢复正常工作就问题不大了。不过这需要实现类似Oracle的MAA、GDS这样的高可用框架。

第六,0数据丢失。对于大部分业务系统来说,如果能实现0数据丢失是最好的,0数据丢失意味着主备切换的时候,应用系统不需要考虑数据丢失的问题。当然这个问题大部分还是能够通过应用来解决的,难度也不是很大。

第七,提升资源管理能力,特别是内存管理能力。PG数据库的内存管理能力还只相当于Oracle的8i时代,通过设置WORM_MEM等来控制BACKEND的内存使用,从而确保数据库系统运行的问题。引入类似Oracle PGA自动管理的模式,可以让数据库充分的,更高效的利用现代硬件提供的大内存,同时避免出现OOM,这一点对于核心业务系统来说十分关键。

第八,是提升CBO优化器的功能。我之所以把这一条放到最后一条来写,那是因为这一点是最难的。和Oracle的CBO相比,PG的CBO优化器虽然比MYSQL要复杂的多,也强大不少,但是对于用户来说还是十分不友好,在很多情况下,用户不得不改写SQL来满足业务性能方面的需求。

第九  是数据的完整性和安全性。在这方面PG数据库存在几个比较明显的不足。首先是数据库对数据完整性的校验不够完善,以前我也写文章提出过在PG数据库里面,一张表如果比较大,需要用多个文件来存储,如果丢失了一个或者数个数据文件,目前PG的RDBS核心是没有办法感知到的。此时如果要扫描这张丢失了某些数据文件的表,RDBMS不会报错,但是会得出错误的查询结果。

第十一  PG数据库对自己的数据文件临时文件的清理工作是做的不完整的。当数据库出现一些问题的时候,或者出现一些异常的时候,是不会自动做清理工作的时间长了就会产生一些垃圾,包括一些孤儿文件。对于一个需要长期,甚至7*24运行的数据库系统来说,自动清理垃圾是必备的能力。

因为缺少PMON/SMON之类的后台进程,当BACKEND的故障的时候,无法由系统自动进行必要的清理工作,因此可能会导致数据存在不一致的可能性,PG可以采取保护措施,让PG数据库宕机。这种方式虽然是有效的,但是这种做法不是一个企业级数据库应该有的。想要让PG数据库在这方面像一个企业级数据库一样就必须建立一组新的后台进程,从而实现像oracle一样能够自如的应对各种系统故障以及进程故障。

第十二 快速切换 当前基于流复制的高可用方案其缺点就是对于关键业务系统来说,快速的全自动切换实现起来十分困难。因为只有复制完成,并且数据确保0丢失情况下,对于关键系统才敢做自动化切换,而目前的流复制模式还是不够让人放心。基于RAFT/PAXOS复制组的实现,只要确保延时够低,也是可接受的。不过成本略高,而且保护能力并不完整。

其它问题

  • SQL引擎增强:PG缺少不少算子,比如HASH ANTI JOIN等,企业级应用十分复杂,如果数据量比较大,业务逻辑相对复杂,缺失算子的问题会导致某些业务无法快速执行

  • 分区表功能与能力向Oracle看齐:大型企业级应用,分区表的使用十分多,虽然PG也有分区表,但是其管理便捷性,访问性能,对于超过1万分区的大型表的支持能力都还很欠缺。另外类似分区分裂、交换分区之类的能力也尚有缺失;

  • 全局临时表性能优化:PG的全局分区表功能虽然和Oracle差不多,不过一些国内的ERP厂商已经领教过了PG的全局临时表的性能问题,前些年在分析一个全局临时表的性能问题的时候,我也读过这部分PG的源码,写得真的不怎么样;

  • 表的在线重定义:需要长期7*24运行的企业级业务系统,对于超大表的再现重定义能力十分关键;

  • SHARED BUFFERS越大,DROP TABLE等操作越慢的问题:这是因为PG的CHECKPOINT机制不够优化导致的,Oracle当年为了优化这方面问题,对kcbdws数据结构做了多次优化,对CHECKPOINT QUEUE,LRU-W等链表的算法做了多次重构,才达到了目前的水平,基于PG的国产数据库也必须在此做大量的优化;

  • 复制延时控制:有效控制复制延迟,优化并发回放的性能;

相关文章:

PG与ORACLE的差距

首先必须是XID 64,一个在极端环境下会FREEZE的数据库无论如何都无法承担关键业务系统的重任的,我们可以通过各种配置,提升硬件的性能,通过各种IT管控措施来尽可能避免在核心系统上面临FREEZE的风险,不过并不是每个企业…...

树莓派3B+驱动开发(2)- LED驱动(传统模式)

github主页:https://github.com/snqx-lqh 本项目github地址:https://github.com/snqx-lqh/RaspberryPiDriver 本项目硬件地址:https://oshwhub.com/from_zero/shu-mei-pai-kuo-zhan-ban 欢迎交流 笔记说明 如我在驱动开发总览中说的那样&…...

超详细搭建PhpStorm+PhpStudy开发环境

刚开始接触PHP开发,搭建开发环境是第一步,网上下载PhpStorm和PhpStudy软件,怎样安装和激活就不详细说了,我们重点来看一看怎样搭配这两个开发环境。 前提:现在假设你已经安装完PhpStorm和PhpStudy软件。 我的PhpStor…...

分析比对vuex和store模式

在 Vue 中,Vuex 和 store 模式 是两个不同的概念,它们紧密相关,主要用于管理应用的状态。下面我会详细介绍这两个概念,并通过例子帮助你更好地理解。 1. Vuex 是什么? Vuex 是 Vue.js 的一个状态管理库,用…...

C# 网络编程--基础核心内容

在现今软件开发中,网络编程是非常重要的一部分,本文简要介绍下网络编程的概念和实践。 C#网络编程的主要内容包括以下几个方面‌: : 上图引用大佬的图,大家也关注一下,有技术有品质,有国有家,情…...

【C++游戏程序】easyX图形库还原游戏《贪吃蛇大作战》(三)

承接上一篇文章:【C游戏程序】easyX图形库还原游戏《贪吃蛇大作战》(二),我们这次来补充一些游戏细节,以及增加吃食物加长角色长度等设定玩法,也是本游戏的最后一篇文章。 一.玩家边界检测 首先是用来检测…...

uni-app H5端使用注意事项 【跨端开发系列】

🔗 uniapp 跨端开发系列文章:🎀🎀🎀 uni-app 组成和跨端原理 【跨端开发系列】 uni-app 各端差异注意事项 【跨端开发系列】uni-app 离线本地存储方案 【跨端开发系列】uni-app UI库、框架、组件选型指南 【跨端开…...

SpringBoot中的@Configuration注解

在Spring Boot中,Configuration注解扮演着非常重要的角色,它是Spring框架中用于定义配置类的一个核心注解。以下是Configuration注解的主要作用: 定义配置类: 使用Configuration注解的类表示这是一个配置类,Spring容器…...

十二、路由、生命周期函数

router路由 页面路由指的是在应用程序中实现不同页面之间的跳转,以及数据传递。通过 Router 模块就可以实现这个功能 2.1创建页面 之前是创建的文件,使用路由的时候需要创建页面,步骤略有不同 方法 1:直接右键新建Page(常用)方法 2:单独添加页面并配置2.1.1直接右键新建…...

【蓝桥杯每日一题】X 进制减法

X 进制减法 2024-12-6 蓝桥杯每日一题 X 进制减法 贪心 进制转换 题目大意 进制规定了数字在数位上逢几进一。 XX 进制是一种很神奇的进制, 因为其每一数位的进制并不固定!例如说某 种 XX 进制数, 最低数位为二进制, 第二数位为十进制, 第三数位为八进制, 则 XX 进制…...

《蓝桥杯比赛规划》

大家好啊!我是NiJiMingCheng 我的博客:NiJiMingCheng 这节课我们来分享蓝桥杯比赛规划,好的规划会给我们的学习带来良好的收益,废话少说接下来就让我们进入学习规划吧,加油哦!!! 一、…...

C++算法练习day70——53.最大子序和

题目来源:. - 力扣(LeetCode) 题目思路分析 题目:寻找最大子数组和(也称为最大子序和)。 给定一个整数数组 nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素&#x…...

import是如何“占领满屏“

import是如何“占领满屏“的? 《拒绝使用模块重导(Re-export)》 模块重导是一种通用的技术。在腾讯、字节、阿里等各大厂的组件库中都有大量使用。 如:字节的arco-design组件库中的组件:github.com/arco-design… …...

ceph /etc/ceph-csi-config/config.json: no such file or directory

环境 rook-ceph 部署的 ceph。 问题 kubectl describe pod dragonfly-redis-master-0Warning FailedMount 7m59s (x20 over 46m) kubelet MountVolume.MountDevice failed for volume "pvc-c63e159a-c940-4001-bf0d-e6141634cc55" : rpc error: cod…...

C语言——验证“哥德巴赫猜想”

问题描述: 验证"哥德巴赫猜想" 任何一个大于2的偶数都可以表示为两个质数之和。例如,4可以表示为22,6可以表示为33,8可以表示为35等 //验证"哥德巴赫猜想" //任何一个大于2的偶数都可以表示为两个质数之和…...

Flourish笔记:柱状图(Column chart (grouped))

文章目录 样式设定Chart Type:图表类型Controls & Filters:展示方式Colors:颜色bars:柱子的调整labels:柱子数字标注X axis:横坐标标签Y axis:纵坐标标签Plot BackgroundNumber FormatingLe…...

深度学习案例:DenseNet + SE-Net

本文为为🔗365天深度学习训练营内部文章 原作者:K同学啊 一 回顾DenseNet算法 DenseNet(Densely Connected Convolutional Networks)是一种深度卷积神经网络架构,提出的核心思想是通过在每一层与前面所有层进行直接连接…...

excel文件合并,每个excel名称插入excel列

import pandas as pd import os # 设置文件夹路径 folder_path rC:\test # 替换为您的下载文件夹路径 output_file os.path.join(folder_path, BOM材料.xlsx) # 创建一个空的 DataFrame 用于存储合并的数据 combined_data pd.DataFrame() # 遍历文件夹中的所有文件 for …...

Linux 如何设置特殊权限?

简介 通过使用 setuid、setgid 、sticky,它们是 Linux 中的特殊权限,可以对文件和目录的访问和执行方式提供额外的控制。 命令八进制数字功能setuid4当执行文件时,它以文件所有者的权限运行,而不是执行它的用户的权限运行。setg…...

零基础如何使用ChatGPT快速学习Python

引言 AI编程时代来临,没有编程基础可以快速上车享受时代的红利吗?答案是肯定的。本文旨在介绍零基础如何利用ChatGPT快速学习Python编程语言,开启AI编程之路。解决的问题包括:传统学习方式效率低、缺乏互动性以及学习资源质量参差…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来&#xf…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

Redis数据倾斜问题解决

Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

JVM 内存结构 详解

内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: ​ 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)

前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 ​…...

TCP/IP 网络编程 | 服务端 客户端的封装

设计模式 文章目录 设计模式一、socket.h 接口(interface)二、socket.cpp 实现(implementation)三、server.cpp 使用封装(main 函数)四、client.cpp 使用封装(main 函数)五、退出方法…...