关于postgresql:从Oracle迁移到PostgreSQL的十大理由

42次阅读

共计 9410 个字符,预计需要花费 24 分钟才能阅读完成。

作者:保罗·纳穆格
Paul Namuag 可能负责各种职务,受害于在过来的 18 年中有机会应用各种技术。他从 2005 年开始负责图形艺术家和 MS .Net 开发人员,并转而应用开源技术,并且是应用 LAMP stack 的 Web 开发人员。之后,他是一名软件工程师 / 游戏工程师,曾与多家公司合作开发挪动或桌面和 Web 应用程序。2013 年下半年,他转任 MySQL 反对工程师,而后成为 Percona 的近程 DBA,从而有机会理解大数据,高可伸缩性,高可用性应用程序的工作形式。

前言

Oracle 关系数据库管理系统(RDBMS)已被企业宽泛应用,迄今为止被认为是市场上最先进的数据库技术。通常,它是 RDBMS 中最常拿来与其余数据库进行比拟的的产品,充当了产品应提供的规范“事实”。db-engines.com 将其评为当今市场上排名第一的 RDBMS。PostgreSQL 被列为第四名 RDBMS,但这并不意味着迁徙到 PostgreSQL 没有任何劣势。PostgreSQL 自 1989 年以来始终存在,并于 1996 年凋谢源代码。PostgreSQL 从 2017 年和 2018 年间断两年取得年度 DBMS 奖。这表明它从没有进行吸引大量用户和企业的青眼。

PostgreSQL 之所以引起宽泛关注的起因之一是因为人们正在寻找 Oracle 的代替产品,以便他们能够削减组织的高老本并防止供应商的锁定。

从工作高效的 Oracle 数据库迁徙可能是一项艰巨的工作。诸如公司的 TCO(总领有老本)之类的担心是公司迁延决定是否放弃甲骨文的起因之一。

在此博客中,咱们将介绍一些公司抉择来到 Oracle 并迁徙到 PostgreSQL 的次要起因。

起因一:这是一个真正的开源我的项目

PostgreSQL 是开源的,并依据 PostgreSQL 许可证发行,PostgreSQL 许可证是自在的开源许可证,相似于 BSD 或 MIT 许可证。取得产品和反对不须要任何费用。

如果要应用数据库软件,则意味着您能够收费取得 PostgreSQL 数据库的所有可用性能。PostgreSQL 在数据库畛域已有 30 多年的悠久历史,自 1996 年以来就始终以开源为根底。数十年来,开发人员始终致力于创立扩大性能。这自身就能促使开发人员,机构和组织抉择 PostgreSQL 用于企业应用程序,反对当先的业务和挪动应用程序。

企业再次意识到,像 Postgres 这样的开源数据库解决方案提供了更大的容量,灵活性和反对,而并不齐全依赖于任何一家公司或开发人员。与以前的 Linux 一样,Postgres 由致力于解决日常业务问题,并抉择将解决方案返回给社区的用户设计(并将持续放弃)。与像 Oracle 这样的大型开发商不同,后者可能有不同的动机来开发有利可图的产品或反对狭隘但有利润的市场,而 Postgres 社区致力于为用户日常应用关系数据库开发最好的工具。

PostgreSQL 通常执行这些工作而不会减少太多复杂性。其设计严格专一于解决数据库,而不用浪费资源,例如通过增加性能来治理其余 IT 环境。这是该开源软件的使用者从 Oracle 迁徙到 PostgreSQL 时的事件之一。花大量工夫钻研无关 Oracle 数据库如何运行或如何优化和调优的简单技术,最终可能会失去其低廉的反对。这吸引了机构或组织寻找代替计划,能够加重老本的同时,带来利润和生产率。请查看咱们以前的博客,理解 PostgreSQL 在 SQL 语法和 Oracle 语法之间的匹配能力。

起因二:没有许可限度,而且社区很大

对于 Oracle RDBMS 平台的用户来说,很难找到任何类型的收费或不收取高额费用的社区反对。机构,组织和开发人员通常能在网上找到代替信息,这些信息能够收费提供问题的答案或解决方案。

应用 Oracle 时,很难确定是否抉择产品技术支持,因为,通常波及较多费用。应用 PostgreSQL,该社区是收费的,并且有很多领有丰盛教训的专家,他们乐于为您解决以后的问题。

您能够在这里 https://lists.postgresql.org/ 订阅邮件列表,以开始与社区分割。接触 PostgreSQL 的老手或蠢才可在这里进行交换,展现和共享解决方案、技术、谬误、新发现,甚至共享其新兴软件。您甚至能够应用 irc.freenode.net退出 #postgresql 频道,从 IRC 聊天中寻求帮忙。您还能够退出 https://postgres-slack.herokuapp.com/ 或 https://postgresteam.slack.com/ 通过 Slack 与社区分割。有很多抉择,很多开源组织能够为您提供帮忙。

无关从何处开始的更多详细信息,请拜访 https://www.postgresql.org/community/。

如果您违心为 PostgreSQL 中更优质的业余服务买单,这里也有很多抉择。即便在网站 https://www.postgresql.org/support/professional_support/northamerica/ 上查看,也能够找到大量公司,其中一些公司的价格便宜。即便在 Severalnines,咱们也提供对 Postgres 的反对,它是 ClusterControl 许可或 DBA 技术咨询的一部分。

起因三:广泛支持 SQL 一致性

PostgreSQL 始终热衷于适应和遵循 SQL 语言规范。SQL 规范的正式名称是 ISO/IEC 9075“数据库语言 SQL”。规范发行版的任何后续订正版本都将替换以前的版本,因而宣称与晚期版本保持一致并没有多少价值。

与 Oracle 不同,依然存在一些不合乎 ANSI 规范 SQL(结构化查询语言)的关键字或运算符。例如,初学者容易混同的 OUTER JOIN(+)(Oracle 运算符语法)。PostgreSQL 遵循用于 JOIN 语法的 ANSI-SQL 规范,并具备与其余开源 RDBMS 数据库(例如 MySQL/Percona/MariaDB 数据库)轻松跳转的劣势。

在 Oracle 中十分常见的另一种语法是应用分层查问。Oracle 应用非标准的 START WITH..CONNECT BY 语法,而在 SQL:1999 中,层次结构查问是通过递归通用表表达式 (CTE) 实现的。例如,比照以下分层查问的不同表白:

Oracle
SELECT
restaurant\_name,
city\_name
FROM
restaurants rs
START WITHrs.city\_name = 'TOKYO'
CONNECT BY PRIOR rs.restaurant\_name = rs.city\_name;

PostgreSQL
WITH RECURSIVE tmp AS (SELECT restaurant\_name, city\_name
FROM restaurants
WHERE city\_name = 'TOKYO'
UNION
SELECT m.restaurant\_name, m.city\_name
FROM restaurants m
JOIN tmp ON tmp.restaurant\_name = m.city\_name)
SELECT restaurant\_name, city\_name FROM tmp;

PostgreSQL 与其余顶级开源 RDBMS(例如 MySQL / MariaDB)具备十分类似的办法。

依据 PostgreSQL 手册,PostgreSQL 开发的目标是与规范的最新正式版本保持一致,在这种状况下,这种统一不与传统性能或常识相矛盾。反对 SQL 规范所需的许多性能,只管有时语法或性能略有不同。实际上,这对于 PostgreSQL 来说是很棒的,因为无论怎样,PostgreSQL 都受到不同组织的反对和合作。关键在于其 SQL 语言符合标准的要求。

PostgreSQL 的开发旨在与规范的最新正式版本保持一致,在这种状况下,这种一致性不会与传统性能或常识相冲突。反对 SQL 规范所需的许多性能,只管有时语法或性能略有不同。随着工夫的流逝,无望进一步实现一致性。

起因四:查问并行

偏心地说,与 Oracle 的 SQL 语句并行执行相比,PostgreSQL 的查问并行性并不丰盛。Oracle 并行性的性能包含带提醒的语句排队,设置并行度(DOP),设置并行度策略或自适应并行性的能力。

PostgreSQL 依据反对的打算具备简略的并行度,但这并没有定义 Oracle 在开源 PostgreSQL 方面的劣势。

PostgreSQL 的并行性始终在一直进步,并被社区一直加强。当 PostgreSQL 10 公布时,它加强了对公众的吸引力,特地是对合并连贯,位图堆扫描,索引扫描和仅索引扫描,汇集合并等并行性反对的改良。还为 pg_stat_activity 增加了统计信息。

在 PostgreSQL V10 中,默认状况下禁用并行性,您须要设置变量
“max_parallel_workers_per_gather
postgres=# \timing
Timing is on.
postgres=# explain analyze select * from imdb.movies wherebirthyear >= 1980 and birthyear <=2005;
QUERYPLAN
—————————————————————————————————————-
Seq Scan on movies  (cost=0.00..215677.28rows=41630 width=68) (actual time=0.013..522.520 rows=84473 loops=1)
Filter: ((birthyear >= 1980) AND (birthyear <=2005))
Rows Removed by Filter: 8241546
Planning time: 0.039 ms
Execution time: 525.195 ms
(5 rows)
Time: 525.582 ms
postgres=# \o /dev/null
postgres=#  select * from imdb.movies where birthyear>= 1980 and birthyear <=2005;
Time: 596.947 ms“
查问打算显示,它的理论工夫大概能够是 522.5 ms,而后理论查问执行工夫大概是 596.95 ms。

来看启用并行性后的后果:
`postgres=# set max_parallel_workers_per_gather=2;
Time: 0.247 ms
postgres=# explain analyze select * from imdb.movies wherebirthyear >= 1980 and birthyear <=2005;
QUERYPLAN
——————————————————————————————————————————-
Gather  (cost=1000.00..147987.62 rows=41630width=68) (actual time=0.172..339.258 rows=84473 loops=1)
Workers Planned: 2
Workers Launched: 2
->  Parallel Seq Scan on movies (cost=0.00..142824.62 rows=17346 width=68) (actual time=0.029..264.980 rows=28158 loops=3)
Filter: ((birthyear >= 1980) AND (birthyear <=2005))
Rows Removed by Filter: 2747182
Planning time: 0.096 ms
Execution time: 342.735 ms
(8 rows)
Time: 343.142 ms
postgres=# \o /dev/null
postgres=#  select * from imdb.movies where birthyear>= 1980 and birthyear <=2005;
Time: 346.020 ms`
查问打算确定查问须要应用并行性,而后应用 Gather 节点。它的理论工夫预计为 339 毫秒(蕴含 2 个并行工作过程),预计为 264 毫秒(查问打算汇总之前)。当初,查问的理论执行工夫为 346ms,十分靠近查问打算中预计的理论工夫。

这仅阐明了 PostgreSQL 的性能和好处。只管 PostgreSQL 在应用并行性或查问打算确定它比应用并行性要快时有其本身的局限性,但它的性能并没有与 Oracle 产生微小差别。PostgreSQL 的并行性很灵便,只有您的查问与查问并行性所需的程序匹配,就能够正确启用或利用它。

起因五:先进的 JSON 反对,并且一直在晋升

与其余凋谢源代码 RDBMS 相比,PostgreSQL 中的 JSON 反对始终处于等同程度。能够看一下 LiveJournal 的博客(博客地址 https://obartunov.livejournal…),其中 PostgreSQL 的 JSON 反对显示出相比其余 RDBMS 总是更高级。PostgreSQL 具备大量的 JSON 函数和性能。

JSON 数据类型在 PostgreSQL-9.2 中引入。从那时起,它有了许多重大的晋升,并且在 PostgreSQL-9.4 中呈现了次要的晋升,减少了 JSONB 的数据类型。PostgreSQL 提供了两种存储 JSON 数据的数据类型:json 和 JSONB。对于 JSONB,它是 JSON 数据类型的高级版本,以二进制格局存储 JSON 数据。这是次要的加强性能,与在 PostgreSQL 中搜寻和解决 JSON 数据的形式有很大的不同。

Oracle 也广泛支持 JSON。相比之下,PostgreSQL 提供了宽泛的反对,能够用于数据检索、数据格式化或条件操作,这些操作会影响数据的输入,甚至影响数据库中存储的数据。应用 jsonb 数据类型存储的数据具备很大的劣势,即可能应用 GIN(通用倒排索引),GIN 可用于无效搜寻大量 jsonb 文档中呈现的键或键 / 值对。

PostgreSQL 有额定的扩大,有助于将 jsonb 的类型转换为它反对的过程语言。这些扩大是针对 PL/Perl 的 jsonb_plperl 和 jsonb_plperlu。而对于 PL/Python,它们是 jsonb_plpythonu、jsonb_plpython2u 和 jsonb_plpython3u。例如,应用 jsonb 值来映射 Perl 数组,您能够应用 jsonb_plperl 或 jsonb_plperlu 扩大。

ArangoDB 公布了一个基准,将 PostgreSQL 的 JSON 性能与其余反对 JSON 的数据库进行了比拟。只管这是一个较老的博客,但它依然展现了 PostgreSQL 的 JSON 与其余数据库相比的性能。在其余数据库中,JSON 是其内核的外围性能。这阐明 JSON 即便只是 PostgreSQL 的附加性能也具备肯定的劣势。

起因六:次要云供应商对 DBaaS 的反对

PostgreSQL 已作为 DBaaS 失去广泛支持。这些服务来自亚马逊、微软 Azure 数据库和谷歌 Cloud SQL。

相比之下,Oracle 仅在 Amazon RDS for Oracle 上可用。次要参与者提供的服务以实惠的价格开始,并且能够依据您的需要进行灵便设置。这有助于机构和组织进行相应的设置,并加重 Oracle 平台上捆绑的巨额老本。

起因七:更好地解决海量数据

PostgreSQL RDBMS 不适用于解决剖析和数据仓库类的工作负载。PostgreSQL 是一个面向行的数据库,然而它具备存储大量数据的能力。PostgreSQL 在解决数据存储时有以下限度:

PostgreSQL 的次要长处是,曾经有一些插件能够合并以解决大数据量。TimeScaleDB 和 CitusData 的 cstore_fdw 能够合并到工夫序列数据库,存储挪动、物联网应用程序中的大量数据,作为数据分析或数据仓库的插件之一。实际上,ClusterControl(某产品)提供了对 TimeScaleDB 的反对,该反对既简略又易于部署。

如果要应用 PostgreSQL 的外围性能,则能够应用 jsonb 存储大量数据。例如,大量文档(PDF,Word,电子表格)能够应用 jsonb 数据类型存储。对于天文定位应用程序或零碎,能够应用 PostGIS。

起因八:便宜的可伸缩性,高可用性,冗余 / 天文冗余和容错解决方案

Oracle 提供了相似的解决方案,例如 OracleGrid,Oracle Real Application Clusters(RAC),Oracle Clusterware 和 Oracle Data Guard。这些技术可能会减少您的老本,并且部署和稳固保护的费用出其不意地低廉,而且一旦用上很难放弃这些解决方案。必须培训技术人员加强技能,并造就参加部署和施行过程的人员。

PostgreSQL 有大量的反对,并且有很多抉择。PostgreSQL 蕴含内置外围程序包中的流和逻辑复制。您还能够为 PostgreSQL 设置同步复制,以领有更多的高可用群集,同时使备用节点解决读取查问。对于高可用性,咱们建议您浏览咱们的博客 PostgreSQL 顶级 PG 集群高可用性(HA)解决方案,其中涵盖了许多不错的工具和技术供您抉择。

还有一些企业性能能够提供高可用性,监督和备份解决方案。ClusterControl 是这项技术之一,与 Oracle 解决方案相比,价格合理。

起因九:反对多种过程语言:PL/pgSQL、PL/Tcl、PL/PerlPL/Python

从 9.4 版开始,PostgreSQL 具备一个很棒的性能,您能够依据本人的抉择定义新的过程语言。只管不反对所有编程语言,然而它具备许多受反对的语言。以后,通过根本发行版,它包含 PL / pgSQL,PL / Tcl,PL/ Perl 和 PL / Python。内部语言是:

这样做的益处是,与 Oracle 不同,新进入 PostgreSQL 的开发人员能够疾速为他们的应用程序零碎提供业务逻辑,而无需破费更多工夫来学习 PL / SQL。PostgreSQL 使开发人员的环境更加轻松和高效。PostgreSQL 的这种性质有助于开发人员喜爱 PostgreSQL 并开始将企业平台解决方案转移到开源环境。

起因十:大数据集、文本数据的灵便索引(GIN,GiST,SP-GiST 和 BRIN)

PostgreSQL 在反对索引方面具备微小的劣势,这有利于解决大数据。Oracle 有很多索引类型,它们也有利于解决大型数据集,尤其是全文索引。然而对于 PostgreSQL,这些类型的索引是依据你的目标而灵便设置的。例如,这些类型的索引实用于大数据:

GIN-(狭义倒排索引)

此类索引实用于 jsonb,hstore,range 和 arrays 数据类型列。当您的数据类型在单个列中蕴含多个值时,此性能很有用。依据 PostgreSQL 文档,“GIN 用于解决要建设索引的我的项目是复合值的状况,并且要通过索引解决的查问搜寻呈现在复合我的项目内的元素值。例如,这些我的项目能够是文档,而查问能够是对蕴含特定单词的文档的搜寻。”

GiST-(通用搜寻树)

由节点页面组成的高度均衡的搜寻树。节点由索引行组成。通常,叶节点的每一行(叶行)都蕴含一些谓词(布尔表达式)和对表行(TID)的援用。GiST 索引最好用于几何数据类型,比方查看两个多边形是否蕴含某个点。在一种状况下,一个特定的点可能蕴含在一个框中,而另一个点只存在于一个多边形中。在解决全文搜寻时,要利用 GiST 索引的最常见数据类型是几何类型和文本

在抉择应用哪种索引类型(GiST 或 GIN)时,请思考以下性能差别:

  • GIN 索引查找速度比 GiST 快三倍
  • GIN 索引的构建工夫比 GiST 长三倍
  • GIN 索引的更新速度稍慢于 GiST 索引,然而如果禁用了疾速更新反对,则大概慢 10 倍
  • GIN 索引比 GiST 索引大 2 至 3 倍

依据教训,GIN 索引最适宜静态数据,因为查找速度更快。对于动态数据,GiST 索引的更新速度更快。

SP-GiST-(空间分区 GiST)

对于具备天然但不平均集群的较大数据集。这种类型的索引利用空间分区树。当您的数据有一个天然的集群元素,并且不是一个平衡的树时,SP-GiST 索引最有用。一个很好的例子是电话号码,例如在美国,他们应用以下格局:

  • 3 位区号
  • 前缀为 3 位数字(与电话运营商的交换机无关)
  • 行号的 4 位数字

这意味着您在第一组 3 位数,第二组 3 位数四周有一些天然的聚类,而后数字可能会以更平均的散布散开。然而,因为电话号码的存在,一些区号比其余区号的饱和度要高得多。后果可能是树十分不均衡。因为事后的天然聚类和数据的不均匀分布,像电话号码这样的数据能够作为 spgist 的一个很好的例子。

BRIN-(区块范畴索引)

对于按顺序排列的大型数据集。块范畴是一组彼此相邻的页面,其中所有这些页面的摘要信息存储在索引中。块范畴索引能够专一于一些与 SP-GiST 类似的用例,当对数据进行天然排序时,数据往往十分大,最好应用它们。譬如有十亿记录表,尤其是工夫序列数据,BRIN 可能会提供无效帮忙。如果要查问天然分组在一起的大量数据,例如几个邮政编码的数据(而后汇总到某个城市),则 BRIN 有助于确保类似的邮政编码在磁盘上彼此凑近。

当您领有十分大的数据集(例如日期或邮政编码)时,BRIN 索引可让您疾速跳过或排除许多不必要的数据。此外,BRIN 被保护为绝对于整体数据大小而言较小的索引,这使它们在解决大型数据集时十分有劣势。

论断

在与 Oracle 的企业平台和业务解决方案竞争时,PostgreSQL 具备一些次要劣势。将 PostgreSQL 作为开源 RDBMS 的首选是相对可信赖的,因为它简直像 Oracle 一样弱小。

Oracle 很难被击败(这是一个很难承受的事实),并且摈弃技术巨头的企业平台也不容易。当零碎为您提供能力和生产成绩时,这可能是一个难题。

但有时须要在某些状况下必须做出抉择,因为对平台的继续适度投资可能会超过其余业务层优先级的老本,从而影响进度。

能够抉择 PostgreSQL 及其底层平台解决方案来帮忙您降低成本,加重估算问题;而且所有的变动都不算大。

更多精彩内容,请关注以下平台、网站:

中国 Postgre SQL 分会官网公众号(技术文章、技术流动):
开源软件联盟 PostgreSQL 分会

中国 Postgre SQL 分会技术问答社区:
www.pgfans.cn

中国 Postgre SQL 分会官方网站:
www.postgresqlchina.com

号外!!!秋季投稿征集令——送走了春夏 迎来了金秋 在这金秋送爽之季 开源软件联盟 PostgreSQL 分会迎来了新一批的稿件征集 内容次要是与咱 postgresql 严密相干即可,文章题材涵盖畛域不限,最好是系列型文章 欢送宽广技术人员持续投稿!
投稿格局:word PDF
投稿邮箱:partner@postgresqlchina.com
近期咱们将举办 PGcon 流动 有幸邀请到了许多大咖 请大家注意咱官网公众号 听取进一步音讯告诉安顿!

正文完
 0