暂无图片
暂无图片
6
暂无图片
暂无图片
暂无图片

PostgreSQL 和 Oracle 完整对比

Rhein 2025-04-30
707

王志斌 学思笨骆驼


 2025年04月29日 07:58 四川

摘要

Oracle 和 PostgreSQL 是两大领先的关系型数据库管理系统,二者采取了截然不同的方法。Oracle 由 Oracle 公司开发,是一种商业企业级数据库,以其强大的功能和可靠性而闻名,但伴随着不菲的许可成本。PostgreSQL 则是一款强大的开源替代方案,在不收取许可费用的情况下,提供了高级功能、标准合规和可扩展性。

本文对比分析着眼于它们的架构、功能、性能、许可模式和使用案例,旨在帮助技术专业人士和企业决策者了解它们的优势与局限性。

历史与背景

Oracle 数据库 起源于1977 年,当时 Larry Ellison、Bob Miner 和 Ed Oates 开发出了首个商业 SQL 基础关系型数据库管理系统,并于 1979 年发布为 Oracle V2。其关键发展节点包括 1992 年的 Oracle7(性能提升)、1999 年的 Oracle8i(支持 Java)、2003 年的 Oracle10g(引入网格计算)、2013 年的 Oracle12c(多租户架构)以及 2019 年的 Oracle19c(当前长期支持版本)。Oracle 由Oracle 公司开发和维护,由商业利益和企业需求驱动。

PostgreSQL 源自伯克利分校的POSTGRES 项目,于20 世纪 80 年代中期在 Michael Stonebraker 教授的领导下启动。1996 年,它演变为 PostgreSQL,为其处理复杂数据类型和用户自定义函数的能力增添了 SQL 支持。其主要版本包括 2005 年的 PostgreSQL 8.0(支持 Windows)、2010 年的 9.0(内置复制功能)以及 2023 年的16版本(性能和安全性增强)。与 Oracle 不同,PostgreSQL 由全球社区通过PostgreSQL 全球开发小组开发,优先考虑标准合规和可扩展性,同时保持免费和开源。

项目OraclePostgreSQL
架构复杂,面向企业简单直接
许可商业许可,昂贵(每核心 47,500 美元起)免费,开源(PostgreSQL 许可证)
社区支持商业支持活跃的开源社区
数据类型标准,带有一些高级类型丰富,JSON 支持更佳
可扩展性有限高度可扩展
SQL 标准符合性部分符合,带专有扩展严格遵循标准
可扩展性优秀,通过 RAC 实现横向扩展良好,依赖第三方解决方案进行集群
高可用性内置 RAC 和 Data Guard通过第三方工具提供
安全特性全面的企业级安全强大的基础安全性,可扩展
性能(事务处理)在超大负载下表现卓越在常见负载下表现出色
性能(分析处理)表现优秀,具有专用功能良好,近期版本有所提升
管理(安装)复杂且资源密集简单直接
管理(日常运维)提供全面的内置工具需手动配置及借助第三方工具
管理(监控)提供丰富的内置工具基础监控功能,支持扩展
成本(16 核)约 760,000 美元 + 每年 167,200 美元支持0 美元(许可费用)
适用场景关键企业应用Web 应用、初创企业、对成本敏感的部署

详细对比

架构

Oracle: 企业级,包含众多专用组件:

  • 内存:

    • SGA(共享全局区): 用于共享缓存和 SQL 执行。

    • PGA(进程全局区): 每个进程的专用内存。

    • 包括缓冲区缓存、共享池等。

  • 进程:

    • 服务器进程: 处理用户查询。

    • 后台进程: 数据库写入进程、日志写入进程、检查点进程、SMON(恢复)、PMON(清理)、归档进程。

  • 存储:

    • 控制文件、数据文件、重做/归档日志、参数文件和日志文件。

  • 逻辑结构:

    • 表空间 > 段 > 区 > 数据块。

PostgreSQL: 简单的开源架构:

  • 进程:

    • Postmaster: 管理服务器进程。

    • 每个连接对应一个后端进程

    • 后台任务:写入进程、检查点进程、自动清理进程、WAL写入进程、日志进程。

  • 内存:

    • 共享缓冲区、WAL 缓冲区、工作内存、维护内存。

  • 存储:

    • 数据目录包含 base(存储表数据)、global(存储全局系统目录)、pg_wal(存储 WAL 日志)。

    • 配置文件:postgresql.conf(主配置文件)、postgresql.auto.conf、pg_hba.conf(客户端认证配置文件)。

  • 逻辑结构:

    • 数据库 > 模式 > 表 > 索引。

许可与成本结构

Oracle 提供多种版本,采用不同的定价及许可模式:

  • 企业版 (EE):

    • 功能齐全(安全、性能、高可用性)

    • 每处理器核心约 47,500 美元,或每授权用户 950 美元(最少 25 用户)

    • 附加组件(如 RAC、内存数据库、数据守护)需额外付费

  • 标准版 2 (SE2):

    • 适用于小型部署,限 2 个插槽

    • 每插槽约 17,500 美元,或每授权用户 350 美元(最少 10 用户)

    • 无选配功能

  • 表达版 (XE):

    • 免费,但有限制:2 个 CPU 线程、2GB 内存、12GB 数据

    • 适用于开发或轻量级应用

  • 个人版:

    • 用于单用户开发

    • 定价与 SE2 相当

  • 其他费用:

    • 年度支持服务(约占许可成本的 22%)

    • 管理套件、工程系统(如 Exadata)

PostgreSQL 采用简单开源许可:

  • 许可: PostgreSQL 许可(MIT/BSD 风格)

  • 成本: 免费使用——无费用、限制或用户限制

  • 商业用途: 完全允许,包括嵌入专有应用

  • 可能的费用:

    • 基础设施(云/本地部署)

    • 可选支持或咨询服务

    • 付费第三方工具

数据类型与可扩展性

FeatureOraclePostgreSQL
标准 SQL 类型
JSON 支持受限✅ 内置JSON和 JSONB
XML 支持✅ XMLType✅ 内置支持
空间类型✅ Oracle Spatial✅ 通过PostGIS内置
几何类型✅ POINTLINEPOLYGON
网络地址类型✅ INETCIDR
数组类型✅ 内置ARRAY 类型
范围类型(例如,日期/数字)✅ 内置支持
对象类型 / UDTs✅ 有限制✅ 完整支持 CREATE TYPE
可扩展类型系统⚠️ 限制✅ 高扩展,支持自定义数据类型

数据类型详细对比如下所示:

Oracle 数据类型Oracle 数据类型特征PostgreSQL 完全兼容性PostgreSQL 对应数据类型
CHAR(n)最大长度 2000 字节CHAR(n)
CHARACTER(n)最大长度 2000 字节CHARACTER(n)
NCHAR(n)最大长度 2000 字节CHAR(n)
VARCHAR(n)最大长度 2000 字节VARCHAR(n)
NCHAR VARYING (n)可变长度 UTF-8 字符串,最大长度 4000 字节CHARACTER VARYING(n)
VARCHAR2(n) 11g最大长度 4000 字节。PL/SQL 中最大长度为 32KB。VARCHAR(n)
VARCHAR2(n) 12g最大长度 32767 字节。MAX_STRING_SIZE=EXTENDEDVARCHAR(n)
NVARCHAR2(n)最大长度 4000 字节VARCHAR(n)
LONG最大长度 2GBTEXT
RAW(n)最大长度 2000 字节BYTEA
LONG RAW最大长度 2GBBYTEA

数值类型

Oracle 数据类型Oracle 数据类型特征PostgreSQL 完全兼容性PostgreSQL 对应数据类型
NUMBER浮点数DOUBLE PRECISION
NUMBER(*)浮点数DOUBLE PRECISION
NUMBER(p,s)精度范围为 1 到 38,小数点后位数范围为 -84 到 127DECIMAL(p,s)
NUMERIC(p,s)精度范围为 1 到 38NUMERIC(p,s)
FLOAT(p)浮点数DOUBLE PRECISION
DEC(p,s)定点数DEC(p,s)
DECIMAL(p,s)定点数DECIMAL(p,s)
INT38 位整数INTEGER 或 NUMERIC(38,0)
INTEGER38 位整数INTEGER 或 NUMERIC(38,0)
SMALLINT38 位整数SMALLINT
REAL浮点数DOUBLE PRECISION
DOUBLE PRECISION浮点数DOUBLE PRECISION

日期时间类型

Oracle 数据类型Oracle 数据类型特征PostgreSQL 完全兼容性PostgreSQL 对应数据类型
DATEDATE 数据类型存储日期和时间数据(年、月、日、小时、分钟和秒)TIMESTAMP(0)
TIMESTAMP(p)带小数部分的日期和时间TIMESTAMP(p)
TIMESTAMP(p) WITH TIME ZONE带小数部分和时区的日期和时间TIMESTAMP(p) WITH TIME ZONE
INTERVAL YEAR(p) TO MONTH日期间隔INTERVAL YEAR TO MONTH
INTERVAL DAY(p) TO SECOND(s)日和时间间隔INTERVAL DAY TO SECOND(s)

LOB类型

Oracle 数据类型Oracle 数据类型特征PostgreSQL 完全兼容性PostgreSQL 对应数据类型
BFILE指向二进制文件的指针,最大文件大小为 4 GBLarge Object(实现方式不同)
BLOB二进制大对象,最大文件大小为 4 GBBYTEA
CLOB字符大对象,最大文件大小为 4 GBTEXT
NCLOB可变长度 Unicode 字符串,最大文件大小为 4 GBTEXT

ROWID

Oracle 数据类型Oracle 数据类型特征PostgreSQL 完全兼容性PostgreSQL 对应数据类型
ROWID物理行地址CHARACTER(255)
UROWID(n)通用行 ID,逻辑行地址CHARACTER VARYING

XML

Oracle 数据类型Oracle 数据类型特征PostgreSQL 完全兼容性PostgreSQL 对应数据类型
XMLTYPEXML 数据XML

Logical

Oracle 数据类型Oracle 数据类型特征PostgreSQL 完全兼容性PostgreSQL 对应数据类型
BOOLEAN值为 、 和 ,不能赋值给数据库表列BOOLEAN

空间类型

Oracle 数据类型Oracle 数据类型特征PostgreSQL 完全兼容性PostgreSQL 对应数据类型
SDO_GEOMETRY空间对象的几何描述N/A
SDO_TOPO_GEOMETRY拓扑几何描述N/A
SDO_GEORASTER单行中存储栅格或图像对象N/A

在PostgreSQL中可以在 PostGIS 中处理类似的数据,使用以下替代方案:

  • 对于几何数据,使用 geometry 类型。

  • 对于拓扑数据,使用 PostGIS Topology 扩展。

  • 对于栅格数据,使用 PostGIS Raster 扩展。

多媒体类型

Oracle 数据类型Oracle 数据类型特征PostgreSQL 完全兼容性PostgreSQL 对应数据类型
ORDDicom支持音频数据的存储和管理N/A
ORDDicom支持医学数字成像和通信(DICOM)数据的存储和管理N/A
ORDDoc支持任何类型媒体数据的存储和管理N/A
ORDImage支持图像数据的存储和管理N/A
ORDVideo支持视频数据的存储和管理N/A

PostgreSQL 以其丰富且可扩展的类型系统脱颖而出,为复杂数据建模提供了卓越的支持。

内置函数及分类

        Oracle 和 PostgreSQL 都提供了丰富的内置函数,满足不同场景下的数据处理需求。这些函数在数学、字符串处理、日期时间操作、数据转换、聚合以及逻辑处理等方面都有广泛的应用。

函数类别PostgreSQLOracle
数学函数包含ABS、CEIL、FLOOR、MOD、SQRT等。包含ABS、CEIL、FLOOR、MOD、RAND、SQRT、TRUNC等。
字符串函数包含SUBSTR、STRPOS、REPLACE等。STRPOS用于查找子串位置。包含SUBSTR、INSTR、REPLACE等。INSTR用于查找子串位置。
日期时间函数包含TO_DATE、TO_CHAR、DATE_TRUNC等。包含TO_DATE、TO_CHAR、ADD_MONTHS等。
转换函数包含TO_NUMBER、TO_DATE等。包含TO_NUMBER、TO_DATE等。
聚合函数包含SUM、AVG、MAX、MIN等。包含SUM、AVG、MAX、MIN等。
逻辑函数包含COALESCE、NULLIF等。COALESCE返回第一个非NULL值。包含NVL、COALESCE等。NVL用于处理NULL值。
枚举函数
几何函数
网络地址函数
文本搜索函数
uuid函数
xml函数
json函数
序列操作函数
数字函数
范围/多范围函数
窗口函数
系统信息函数
系统管理函数
服务设置函数
服务器信号函数
备份控制函数
恢复控制函数
快照同步函数
复制管理函数
数据库对象管理函数
索引维护函数
通用文件访问函数
咨询锁函数
触发器函数
事件触发器函数
统计信息函数
字符集函数
排序函数
通用比较函数
大对象函数
集合函数
层次函数
数据挖掘函数
编码与解码函数
环境和标识符函数
分析函数
对象引用函数
模型函数
OLAP函数


SQL 标准符合性和扩展

FeatureOraclePostgreSQL
SQL 标准符合性部分符合,许多专有扩展强符合
过程语言PL/SQLPL/pgSQL
递归查询CONNECT BY(专有语法)标准 CTEs 带 WITH RECURSIVE
窗口函数
物化视图
全文检索✅ 内置支持
语法风格Oracle 专用标准符合

PostgreSQL 更符合 SQL 标准,而 Oracle 提供强大但专有的特性。

索引能力

FeatureOraclePostgreSQL
B 树索引✅ 默认✅ 默认
位图索引
哈希索引
函数 / 表达式索引✅ 基于函数✅ 基于表达式
部分索引⚠️ 通过基于函数的索引✅ 原生支持
域索引✅ 用于自定义数据类型⚠️ 有限(通过扩展或功能变通)
全文索引✅ Oracle Text✅ GIN/GiST 与 tsvector
GiST 索引✅ 通用搜索树
SP-GiST 索引✅ 空间分区 GiST
GIN 索引✅ 通用倒排索引
BRIN 索引✅ 块范围索引
自定义索引类型⚠️ 有限✅ 完全可扩展

PostgreSQL 提供了更丰富的索引类型,使其更适合高级和专用查询场景。

并发和事务

FeatureOraclePostgreSQL
多版本并发控制
读一致性级别语句事务级
行级锁定
隔离级别已提交读、可序列化已提交读、可重复读、可序列化
分布式事务✅ 两阶段提交✅ 两阶段提交
自治事务
咨询锁✅ 应用程序控制锁定

两者均支持强大的事务保证,但 PostgreSQL 在隔离和应用级锁定方面提供了更精细的控制,而 Oracle 独特支持自主事务。

高可用性和复制

FeatureOraclePostgreSQL
集群✅ RAC❌ 无内置集群(使用 Patroni、Stolon 等)
物理复制✅ Data Guard✅ 流复制
可读备机✅ Data Guard✅ 带流复制(热备机)
逻辑复制✅  Golden Gate✅ 自 v10 起内置
同步复制
异步复制
时间点恢复✅ 闪回✅ 内置时间点恢复支持
透明故障转移✅ 应用连续性⚠️ 需外部工具
连接池⚠️ 应用依赖✅ 通过 pgBouncer 或 Pgpool-II

Oracle 提供了更集成的企业级高可用选项,如 RAC 。PostgreSQL 则通过灵活性和第三方工具实现类似目标。

性能特性

FeatureOraclePostgreSQL
结果缓存✅ 查询 + PL/SQL 函数结果缓存
内存列存储❌(可使用 Citus 或 TimescaleDB 扩展)
自动内存管理⚠️ 手动调整所需
并行查询执行✅(有限,但不断改进)
分区✅ 范围、列表、哈希、组合✅ 范围、列表、哈希
即时编译
表 / 索引统计
SQL 优化 / 调整✅ 自动 SQL 调优,SQL 计划管理✅ 基于成本的优化器
查询计划可视化✅ EXPLAIN ANALYZE 和可视化工具
工作负载 / 资源管理✅ 资源管理器⚠️ 手动管理或需第三方工具
连接池⚠️ 应用依赖✅ 通过 pgBouncer、Pgpool-II
外部数据访问✅ 外部数据包装器(FDW)

Oracle 提供了更多内置的企业级性能特性,适用于大型工作负载。PostgreSQL 涵盖了大部分基本需求,并在最近版本中不断改进。

OLTP 工作负载(性能)

FeatureOraclePostgreSQL
OLTP 优化✅ 高吞吐量,低延迟✅ 适用于典型工作负载
并发处理✅ 高级,负载下可预测✅ 高效 MVCC,提升并发性
内存数据支持✅ 内存列存储❌(可用扩展)
结果缓存
查询优化✅ 高级优化器✅ 基于成本的优化器,简单查询性能良好
大规模性能✅ 优秀⚠️ 非常高的流量下可能需要调整

Oracle 在高容量 OLTP 场景中表现出色;PostgreSQL 经过调优后性能良好,适用于大多数事务型工作负载。

分析型工作负载(性能)

FeatureOraclePostgreSQL
并行查询执行
位图索引
星型查询优化
物化视图✅ 带查询重写✅ 手动刷新
分区✅ 成熟,多种策略✅ 最近版本有所改进
内存分析✅ 内存列存储
半结构化数据支持⚠️ JSON 支持有限✅ JSONB 用于分析
外部数据集成✅ 外部数据包装器(FDW)
时序数据支持✅ 使用 TimescaleDB 扩展

Oracle 在大规模分析中领先;PostgreSQL 能力不断提升,尤其是借助扩展。

性能基准测试

Oracle Database Appliance X9-2-HA:

  • 每秒事务处理量(TPS): 每节点 32 个 CPU 核心下超过 35,000 TPS

  • 平均事务响应时间: 少于 12.1 毫秒

PostgreSQL(托管云服务):

PlatformTransactions/sec (TPS)Avg. Latency (ms)
AWS RDS for PostgreSQL~2,700~2.88
Azure Database for PostgreSQL~2,400~3.26
Google Cloud SQL for PostgreSQL~1,300~5.74
Supabase PostgreSQL~1,600~5.10
  • Oracle 在高吞吐量环境下展现卓越性能,尤其在优化的硬件配置下。

  • PostgreSQL 对于大多数工作负载性能可靠,且运营成本更低。

安全特性

FeatureOraclePostgreSQL
行级安全✅ 虚拟私有数据库(VPD)✅ 内置策略
多级安全✅ 标签安全
角色分离✅ 数据库保险库⚠️ 手动角色管理
静态数据加密✅ 透明数据加密(TDE)⚠️ 文件系统级加密
列级数据脱敏✅ 数据脱敏⚠️ 需自定义实现或扩展
列级权限
基于角色的访问控制
SSL/TLS 加密
外部认证✅ 企业用户安全(LDAP、Kerberos)✅ LDAP、GSSAPI
审计日志✅ 内置,全面⚠️ 通过 pgaudit 等扩展
权限分析

Oracle 提供了更多开箱即用的安全工具,适用于严格合规和企业使用场景。PostgreSQL 满足大多数核心需求,通过扩展可弥补高级功能的不足。

安装与设置(管理)

FeatureOraclePostgreSQL
安装复杂性❌ 复杂,涉及多个组件和配置✅ 简单,可通过包管理器安装(apt、yum 等)
磁盘空间要求❌ 高(最小约 6.8 GB)✅ 低(因平台而异)
预安装要求❌ 详细前提条件(用户、内核参数等)✅ 最小前提条件
安装工具✅ Oracle通用安装程序✅ 原生安装程序、Docker 容器
配置选项✅ 丰富⚠️ 初始选项较少,安装后可配置

Oracle 的安装更复杂且资源密集,而 PostgreSQL 提供更简单直接的设置流程。

日常运维(管理)

FeatureOraclePostgreSQL
图形化管理工具✅ 企业管理器✅ pgAdmin、DBeaver等
命令行工具✅ SQL*Plus✅ psql
内存管理✅ 自动⚠️ 需手动调整
存储管理✅ 自动存储管理(ASM)⚠️ 手动配置
性能监控✅ 自动工作负载资料库(AWR)⚠️ 需扩展(如 pg_stat_statements
工作负载管理✅ 数据库资源管理器⚠️ 手动或第三方工具
备份与恢复⚠️ 流程复杂✅ 简单工具(pg_dumppg_restore

Oracle 提供全面的内置管理工具,而 PostgreSQL 更依赖手动配置和第三方工具。Oracle 提供了全面的备份和恢复机制,包括 RMAN(恢复管理器)、闪回技术以及自动化备份,确保可靠的数据保护和快速恢复。PostgreSQL 提供了备份和恢复的选项,包括物理备份和逻辑备份、时间点恢复以及持续归档,以确保数据的保护和可用性,如pg_rman、pg_probackup、pgbackrest,为其在灾备场景下的备份提供了更加灵活的选择。

监控与诊断(管理)

FeatureOraclePostgreSQL
诊断资料库✅ 自动诊断资料库(ADR)❌ 不可用
性能数据收集✅ 自动工作负载资料库(AWR)⚠️ 需扩展(如 pg_stat_statements
会话历史✅ 活动会话历史(ASH)❌ 不可用
查询监控✅ SQL 监控⚠️ 需手动分析(EXPLAIN ANALYZE
图形化仪表盘✅ 企业管理器⚠️ 第三方工具(如 pgAdmin、pganalyze)
日志和跟踪文件✅ 警报日志、跟踪文件✅ 日志文件
动态性能视图✅ V$ 视图✅ pg_stat_* 视图

Oracle 提供广泛的内置监控和诊断工具,而 PostgreSQL 提供基础功能,可通过扩展和第三方工具增强。

跨平台兼容

跨平台兼容性是那些在多个操作系统和环境中运营的企业的重要考量因素。在评估数据库管理系统时,PostgreSQL 与 Oracle 的对比通常会突出两者在兼容性方面的差异,因此了解哪种系统最适合您的特定需求至关重要。

对比内容PostgreSQLOracle
跨平台兼容性概述高度可移植,可在多种国内外操作系统及国产硬件环境上运行兼容多种操作系统,但某些功能和优化可能针对特定平台,国内平台兼容度较差
兼容操作系统Linux 系、Windows、macOS、基于 Unix 的系统多种操作系统
国产硬件环境支持飞腾、龙芯、鲲鹏、申威、海光等
龙芯、申威等不支持
适配性与灵活性完全开源,可轻松适配和编译,确保部署灵活作为商业产品,组织需确保其支持所需平台

结论

Oracle 适合对可靠性要求极高的场景。对于关键任务应用、大型数据仓库以及需要全面企业级功能的场景,Oracle 是理想选择。

PostgreSQL 在现代应用、成本敏感的部署以及需要灵活性和可扩展性的场景中表现出色。

文章转载自Rhein,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论