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编程之路。解决的问题包括:传统学习方式效率低、缺乏互动性以及学习资源质量参差…...
【开源】一款基于SpringBoot 的全开源充电桩平台
一、下载项目文件 下载源码项目文件口令:动作璆璜量子屏多好/~d1b8356ox2~:/复制口令后,进入夸克网盘app即可保存(如果复制到夸克app没有跳转资源,可以复制粘贴口令到夸克app的搜索框也可以打开(不用点搜索按钮&#…...
AI - RAG中的状态化管理聊天记录
AI - RAG中的状态化管理聊天记录 大家好,今天我们来聊聊LangChain和LLM中一个重要的话题——状态化管理聊天记录。在使用大语言模型(LLM)的时候,聊天记录(History)和状态(State)管理是非常关键的。那我们先…...
JAVA安全—SpringBoot框架MyBatis注入Thymeleaf模板注入
前言 之前我们讲了JAVA的一些组件安全,比如Log4j,fastjson。今天讲一下框架安全,就是这个也是比较常见的SpringBoot框架。 SpringBoot框架 Spring Boot是由Pivotal团队提供的一套开源框架,可以简化spring应用的创建及部署。它提…...
【STM32系列】提升ADC采样精度的方法
资料地址 兆易创新GigaDevice-资料下载兆易创新GD32 MCU ADC简介 ADC转换包括采样、保持、量化、编码四个步骤。的采样电容上,即在采样开关 SW 关闭的过程中,外部输入信号通过外部的输入电阻 RAIN 和以及 ADC 采样电阻 RADC 对采样电容 CADC 充电。采样…...
前端面试如何出彩
1、原型链和作用域链说不太清,主要表现在寄生组合继承和extends继承的区别和new做了什么。2、推荐我的两篇文章:若川:面试官问:能否模拟实现JS的new操作符、若川:面试官问:JS的继承 3、数组构造函数上有哪些…...
Linux 切换用户的两种方法
sudo -su user1 与 su - user1 都可以让当前用户切换到 user1 的身份执行命令或进入该用户的交互式 Shell。但它们在权限认证方式、环境变量继承和 Shell 初始化过程等方面存在一些差异。 权限认证方式 su - user1 su 是 “switch user” 的缩写,默认情况下需要你输…...
Spring Boot 3 中Bean的配置和实例化详解
一、引言 在Java企业级开发领域,Spring Boot凭借其简洁、快速、高效的特点,迅速成为了众多开发者的首选框架。Spring Boot通过自动配置、起步依赖等特性,极大地简化了Spring应用的搭建和开发过程。而在Spring Boot的众多核心特性中ÿ…...
Vue实现留言板(实现增删改查)注意:自己引入Vue.js哦
代码: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><scri…...
IDEA创建Spring Boot项目配置阿里云Spring Initializr Server URL【详细教程-轻松学会】
1.首先打开idea选择新建项目 2.选择Spring Boot框架(就是选择Spring Initializr这个) 3.点击中间界面Server URL后面的三个点更换为阿里云的Server URL Idea中默认的Server URL地址:https://start.spring.io/ 修改为阿里云Server URL地址:https://star…...
读取电视剧MP4视频的每一帧,检测出现的每一个人脸并保存
检测效果还不错,就是追踪有点难做 import cv2 import mediapipe as mp import os from collections import defaultdict# pip install msvc-runtime# 初始化OpenCV的MultiTracker # multi_tracker = cv2.MultiTracker_create() # multi_tracker = cv2.legacy.MultiTracker_cre…...
dede旅游网站源码/app推广赚钱平台
初试成绩基本要求对于报考相同专业的全日制和非全日制研究生,报考条件相同的情况下,执行统一的进入复试的基本初试成绩要求。考生符合硕士研究生招生条件要求,初试成绩达到教育部规定的2020年A类考生进入复试的基本要求。“退役大学生士兵专项…...
网站后缀org/百度网页翻译
Oracle基本操作(登陆、用户、表空间、exp/imp、权限)1. 登陆 (在windows上CMD下执行)1.1. 登陆sys帐户SQLPLUS sys AS SYSDBA1.2. 登陆普通用户SQLPLUS 用户名/密码SQLPLUS 用户名/密码111.111.111.111:1521/test2. 创建用户一般分为四步2.1. 创建临时表空间CREATE TEMPORARY T…...
个人建网站一般多少钱/青岛关键词排名提升
Given inorder and postorder traversal of a tree, construct the binary tree. Note:You may assume that duplicates do not exist in the tree.同样是给出了不会有重复数字的条件,用递归较容易实现,代码如下: 1 /**2 * Definition for a…...
怎样做网站流量统计/爱站网影院
1、私募基金概念 私募基金,是指以非公开方式向特定投资者募集资金并以特定目标为投资对象的证券投资基金。私募基金是以大众传播以外的手段招募,发起人集合非公众性多元主体的资金设立投资基金,进行证券投资。 私募(Private Plac…...
保定电子商务网站建设/关键词搜索优化公司
关于Spring集成Quartz有2种方法: 1. JobDetailBean. 2. MethodInvokeJobDetailFactoryBean. 以下从自身使用和理解以及掌握的知识对其进行阐述。 需要注意的是,在使用Spring集成Quartz的时候,一定不要忘记引入spring-support这个包: <!-- …...
三牛网络推广/seo综合查询
看redis官网的介绍: redis确实是有事务的,但是和传统的ACID是否相同呢? 原子性(Atomicity) 原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。 一致性(Consis…...