作者:保罗·纳穆格
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流动 有幸邀请到了许多大咖 请大家注意咱官网公众号 听取进一步音讯告诉安顿!