为何 Server 用户会钟情于 PostgreSQL SQL

引见

PostgreSQL 和 SQL Server 都是宽泛被经常使用的相关数据库。虽然它们具备一些独特的外围特色,但它们之间也存在清楚的差异。本文详细引见了 PostgreSQL 和 SQL Server 之间的相似之处和不同之处。

最关键的一个区别是 PostgreSQL 是开源的,而 SQL Server 由 Microsoft 领有和容许的。此外,您还将了解两个系统在容许和老本、易用性、SQL 语法和合规性、数据类型、可用性能、性能和安保性方面的差异,以及相互比拟中会涵盖的其余几十个主题。

关于思考从商业数据库切换到开源数据库的组织,这会很有用途,但也要求无关这两个系统或许的掂量和长处的更多消息。但是,它实用于任何想了解更多关于相关数据库的人。

主机容许形式

PostgreSQL

PostgreSQL 是依据 PostgreSQL 容许证(开源促成会同意的容许证)颁布的开源数据库。将 PostgreSQL 用于任何目标(包括商业目标)都是收费的。在 PostgreSQL 环球开发组上方,PostgreSQL 会永远以收费和开源软件的方式提供应用户。

Microsoft SQL Server 经过商业容许证提供,并且可以按 CPU 核数或许主机和客户端访问级别(CAL)的形式启动容许。SQL Server 提供两个关键版本,企业版和规范版,以满足组织和集体的性能和多少钱要求。容许老本从规范版的 3,586 美元到企业版(双核)的 13,748 美元不等;主机和 CAL 形式需为主机运转支付 899 美元,外加每位用户 209 美元。在校生和开发人员可以经常使用收费版本启动构建和测试。

数据类型

PostgreSQL 和 SQL Server 的数据类型对比表

数据类型

PostgreSQL

SQL Server

64 位整数

BIGINT

BIGINT

固定长度的字节串

BYTEA

BINARY(n)

1、0 或 NULL

BOOLEAN

BIT

固定长度的字符串,1 <= n <=8000

CHAR(n)

CHAR(n)

可变长度的字符串,1 <= n <=8000

VARCHAR(n)

VARCHAR(n)

可变长度的字符串,<= 2GB

TEXT

VARCHAR(max)

可变长度的字节串,1 <= n <=8000

BYTEA

VARBINARY(n)

可变长度的字节串,<= 2GB

BYTEA

VARBINARY(max)

可变长度的 Unicode UCS-2 字符串

VARCHAR(n)

NVARCHAR(n)

可变长度的 Unicode UCS-2 数据,<= 2GB

TEXT

NVARCHAR(max)

可变长度的字符数据,<= 2GB

TEXT

TEXT

可变长度的 Unicode UCS-2 数据,<= 2GB

TEXT

NTEXT

双精度浮点数

DOUBLE PRECISION

DOUBLE PRECISION

浮点数

DOUBLE PRECISION

FLOAT(p)

32 位整数

INTEGER

INTEGER

定点数

NUMERIC(p,s)

NUMERIC(p,s)

日期,包括年、月和日

DATE

DATE

日期和期间,带秒的小数局部

TIMESTAMP(p)

DATETIME, DATETIME2(p)

带时区的日期和期间

TIMESTAMP(p) WITH TIME ZONE

DATETIMEOFFSET(p)

日期和期间

TIMESTAMP(0)

SMALLDATETIME

无符号整数,0 到 255(8 位)

SMALLINT

TINYINT

UUID(16 字节)

CHAR(16)

UNIQUEIDENTIFIER

智能更新的二进制数据

BYTEA

ROWVERSION

货币金额(32 位)

MONEY

SMALLMONEY

可变长度的二进制数据,<= 2GB

BYTEA

IMAGE

几何类型

POINT, LINE, LSEG, BOX, PATH, POLYGON, CIRCLE

GEOMETRY

天文数据

PostgreSQL

PostgreSQL 没有用于天文数据的内置数据类型。开源的PostGIS资源提供了对天文对象的支持。

SQL Server 具备用于存储天文空间数据的 geography 数据类型。

大小写敏理性

PostgreSQL

PostgreSQL 在处置字符串时辨别大小写。LOWER() 函数准许用户将字符串转换为所有小写以启动计算(也有相似的 UPPER() 函数)。自动状况下,PostgreSQL 会将表和列的称号转换为小写,除非您将这些称号放在引号中。context 模块提供了一个不辨别大小写的字符串数据类型 context,用于比拟值。

自动状况下,SQL Server 不辨别大小写。调整 SQL Server 的排序规定设置,可以更改大小写的辨别。可在数据库或列级别设置辨别大小写的排序规定设置。

索引类型

PostgreSQL

PostgreSQL 为索引类型提供了多个选用,包括 B 树、哈希、通用搜查树(GiST)、空间分区的 GiST、通用倒排索引(GIN)和块范围索引(BRIN)。此外,它还支持表白式索引(经常使用表白式或函数而不是列值创立的索引)和局部索引(表的一局部的索引)。

SQL Server 提供了汇集索引和非汇集索引。汇集索引依据基本值(索引定义中的列)对表或视图中的数据行启动排序和存储。一个表只能有一个汇集索引。非汇集索引与表数据分开存储,并且每个键值条目都有一个指向数据的指针。当您在表列上定义 PRIMARY KEY 和 UNIQUE 解放时,SQL Server 会智能创立这些索引。UNIQUE 解放创立非汇集索引,而 PRIMARY KEY 会创立汇集索引,除非已存在汇集索引。

复制

PostgreSQL

PostgreSQL 支持主从复制。复制可以是同步的,也可以是异步的。异步复制经常使用预写式日志(WAL)向正本节点同步更改。流式复制在 WAL 发生时会流式地传输 WAL,而不是期待 WAL 文件填充完,从而可以更迅速地更新备用主机。

逻辑复制遵照颁布和订阅模型,其中的更改基于数据的复制标识(主键)而不是其物理位置,因此称为“逻辑复制”。物理复制处置文件和目录,而不思考这些物理位置中的内容。PostgreSQL 自身不提供多主复制,但有一些第三方工具提供了多主复制处置打算。

SQL Server 复制将数据从颁布主机复制到订阅主机,并提供三种类型的复制:

SQL Server 中的复制可以是同步提交或异步提交。企业版提供了平等复制,以作为多主复制的代替处置打算。

集群

PostgreSQL

PostgreSQL 支持主机集群,但自身不支持多主集群或双主集群。repmgr等工具可用来轻松保养 PostgreSQL 集群。

SQL Server 提供了 Windows Server 缺点转移集群,可针对主从和双主节点启动性能。规范版仅支持两个节点的集群;更多的节点要求更新到企业版。

高可用

PostgreSQL

PostgreSQL 提供了多种处置打算来满足用户的高可用需求,包括共享磁盘缺点转移、预写式日志传输、数据分区和多种复制方法。Patroni等工具提供了智能缺点转移,经过监控和识别数据库缺点来达成高可用。

SQL Server 在其各个版本中包括了多个高可用工具。其中包括复制、日志传送和缺点转移集群。其 Always On 可用性组(随企业版提供)可在满足特定条件时提供智能缺点转移。

视图

PostgreSQL

PostgreSQL 支持视图 – 自身不存储数据的虚构表。支持可更新的视图,但是要求满足以下条件,否则不会智能更新:

1.该视图的查问必定在 FROM 子句中刚好只要一个局部,该局部可以是表或其余可更新视图。

2.选用列表不得蕴含任何窗口函数、聚合函数或汇合前往函数。

3.查问的顶层不得蕴含以下子句:HAVING、LIMIT、DISTINCT、WITH、INTERSECT、EXCEPT、OFFSET 和 LIMIT。

经常使用便捷查问创立的视图可以更新;经常使用复杂查问创立的视图不能更新,但可以经常使用规定更新复杂视图。还支持物化视图,并且可以经常使用 REFRESH MATERIALIZED VIEW 语句更新物化视图中的数据。

SQL Server 视图可用于安保目标,限度用户对数据的访问。用户定义视图和系统定义视图均受支持。可以经常使用触发器智能更新视图。当对单个基础基表中的列启动修正并间接援用时,可以更新视图中的数据。物化视图在 SQL Server 中称为索引视图;与其余相关数据库中的物化视图不同,索引视图与底层数据同步,因此会智能更新。

触发器

PostgreSQL

PostgreSQL 支持初级触发器。支持的触发事情包括 AFTER、BEFORE 和 INSTEAD OF,它们可运行于 INSERT、UPDATE 和 DELETE 事情。当触发器触发时,它可以经常使用函数口头复杂的 SQL 语句。PostgreSQL 可以灵活口头此操作。

SQL Server 为不同类型的数据库事情提供触发器:

登录触发器准许您响运行户的会话建设事情。这些触发器在身份验证成功后和建设用户会话之前触发。它们有助于审计和控制登录活动。

存储环节

PostgreSQL

PostgreSQL 支持以带有 RETURN VOID 子句的用户定义函数,来定义存储环节。PostgreSQL 支持以各种言语以及规范 SQL 语法,编写存储环节。

SQL Server 支持 Microsoft .NET Framework 支持的言语(个别运转时言语或 CLR,如 VB、C# 或 Python),编写存储环节。

全文检索

PostgreSQL

PostgreSQL 提供了用于全文搜查的初级性能。它经常使用全文索引和词典来放慢搜查速度。PostgreSQL 将预处置的文本文档存储为向量数据类型,将处置后的查问存储为其公用类型。预处置将文本文档解析为称为词位的言语单位,这准许您以不辨别大小写的方式查找单词。

SQL Server 以可选组件提供了全文搜查。全文索引支持基于特定言语规定的搜查。经常使用 T-SQL 命令 CONTAINS 婚配单词和短语,经常使用 FREETEXT 婚配含意,对列或文本数据类型(包括 char、varchar、nchar、nvarchar、text、ntext、image、xml 或 varbinary(max) 和 FILESTREAM)口头搜查。同义词库文件可用于协助查找搜查词的同义词。SQL Server 中的全文搜查不辨别大小写。

正则表白式

PostgreSQL

PostgreSQL 有三种方法来计算正则表白式:LIKE、SIMILAR TO 和 POSIX 正则表白式。

SQL Server 自身不支持正则表白式计算;经常使用 T-SQL 函数 LIKE、SUBSTRING 和 PATINDEX 可以取得相似但有限的结果。

分区

PostgreSQL

SQL Server 支持表分区和索引分区。数据水平分区,并将行组映射到各个分区。单个索引或表的一切分区必定驻留在同一个数据库中,并且该表或索引在查问和更新时被视为单个实体。

标识列

PostgreSQL

PostgreSQL 在版本 10 中引入了一个名为 GENERATED AS IDENTITY 的新解放性能。这种 SERIAL 列的 SQL 规范中的变体,准许您智能为标识列调配惟一值。

要使 SERIAL 列具备惟一解放或成为主键,如今必定要明白指定,就像其余数据类型一样。惟一标识符列是经常使用数据类型 smallserial、serial 和 bigserial 创立的,相似于其余数据库中的自增列个性。

SQL Server 的标识列属性为表创立一个标识列,以便为行生成关键值。创立时指定两个值: seed(第一行的初始值)和 increment(在上一行上参与的量)。自动状况下,种子值和增量值均为 1。每个表只能蕴含一个标识列。除非参与了 PRIMARY KEY 或 UNIQUE 解放,否则不可保障值的惟一性。

计算列

PostgreSQL

PostgreSQL 经常使用术语生成列来示意计算列。此性能是在版本 12 中引入的。生成列在标志为 STORED 时可以物理存储;否则,它们不会被存储,称为虚构型。

   computed_column GENERATED ALWAYS  expression STORED

生成列不能带有标识定义或作为分区键的一局部;它们只能援用行,不能经常使用子查问。不能在 INSERT 或 UPDATE 语句指定生成列的值,但可以接受关键字 DEFAULT。

除十分常使用 PERSISTED 属性启动标志,否则 SQL Server 计算列不会以物理方式存储在表中;仅当值是确定性的或一直前往相反的结果时,才干存储该列。

   computed_column  expression PERSISTED

假设计算列是确定性的,并且是可接受的数据类型,则可以将其用作 PRIMARY KEY 或索引,但不能参与 DEFAULT 或 FOREIGN KEY 解放。不能经常使用 INSERT 或 UPDATE 指定值。

整型

PostgreSQL

PostgreSQL 中有三种整数:SMALLINT(小整数,2 字节类型,范围从 -32,768 到 32,767),INT(整数,4 字节类型,范围从 -2,147,483,648 到 2,147,483,647),BIGINT(大整数:-9223372036854775808 到 9223372036854775807)。

SQL SERVER 支持规范 SQL 整数类型 BIGINT、INT、SMALLINT 和 TINYINT。每种类型的范围和存储大小如下:

PostgreSQL 和 SQL Server 的整型对比表

数据类型

范围

存储

BIGINT

-263(-9,223,372,036,854,775,808) 至 263-1(9,223,372,036,854,775,807)

8 字节

INT

-231(-2,147,483,648) 至 231-1(2,147,483,647)

4 字节

SMALLINT

-215(-32,768) 至 215-1(32,767)

2 字节

TINYINT

0 至 255

1 字节

布尔类型

PostgreSQL

PostgreSQL 布尔数据类型可以有三种形态:

SQL SERVER 中的 BIT 数据类型示意 true/false 布尔值数据。BIT 字段的值为 1、0 或 null。

NoSQL 才干

PostgreSQL

与许多其余相关数据库一样,PostgreSQL 参与了对 JSON 数据的支持,JSON 数据是存储在 NoSQL 系统中的半结构化数据的最罕用格局。但是,由于 SQL 是与 PostgreSQL 数据库交互的惟一方式,因此不应将其视为 NoSQL。

SQL Server 具备内置的 JSON 函数,使您能够经常使用规范 SQL 言语解析 JSON 文档。您可以将 JSON 文档存储在 SQL Server 中,并像在 NoSQL 数据库中一样查问 JSON 数据。不过,由于 SQL Server 是 SQL 数据库,因此不应将其视为 NoSQL。

剖析函数

PostgreSQL

PostgreSQL 支持各种剖析函数,这些函数对一组行口头聚合。有两种类型的剖析函数:窗口函数和聚合函数。聚合函数口头聚兼并前往一组行的单个聚合值(如 sum、avg、min 或 max)。窗口函数为每行前往一个聚合值。

PostgreSQL 支持以下窗口函数:

函数

形容

CUME_DIST

前往行的相对排名

DENSE_RANK

在其分区内对行启动无间隙排名

FIRST_VALUE

前往依据其分区中的第一行计算的值

LAG

前往在分区中的行之前指定物理偏移行的值

LAST_VALUE

前往依据其分区中的最后一行计算的值

LEAD

从分区中行之后偏移行的行中前往一个值

NTILE

尽或许平均地划分分区中的行,而后为每行调配一个从 1 到参数值的整数

NTH_VALUE

前往依据有序分区中的第 n 行计算的值

PERCENT_RANK

前往行的相对排名

RANK

在分区中对行启动有间隙的排名

ROW_NUMBER

对分区中的行启动编号,从 1 开局。

SQL Server 的剖析函数使您能够间接在组内计算移动平均值、运转总计、百分比或前 N 个结果。

SQL Server 支持以下剖析函数:

函数

形容

CUME_DIST (Transact-SQL)

计算组内值的累积散布

FIRST_VALUE (Transact-SQL)

前往一组有序值中的第一个值

LAG (Transact-SQL)

前往前一行的值以比拟值,而无需自衔接

LAST_VALUE (Transact-SQL)

前往一组有序值中的最后一个值

LEAD (Transact-SQL)

前往后续行的值以比拟值,而无需自衔接

PERCENTILE_CONT (Transact-SQL)

依据列值的延续散布计算百分比

PERCENTILE_DISC (Transact-SQL)

依据列值的团圆散布计算百分比

PERCENT_RANK (Transact-SQL)

计算组内一行的相对排名

治理和 GUI 工具

PostgreSQL

PostgreSQL 可以经常使用 Oracle SQL Developer、pgAdmin、OmniDB、DBeaver 和 Navicat,经过图形用户界面启动治理。其余用于监控运转状况和性能的 GUI 工具包括 Nagios、Zabbix、Cacti 和 Prometheus。SQLECTRON 是一个收费和开源的跨平台工具;它与多个 SQL 数据库兼容,包括 SQL Server。

SQL Server 可以经常使用 SQL Server Management Studio(SSMS),这是 Windows 上收费的图形用户界面治理工具。SQL Operations Studio 是一款实用于 Mac 的收费开源跨平台 GUI 工具。SQLECTRON 是一个收费的开源跨平台工具,与包括 PostgreSQL 在内的多个 SQL 数据库兼容。

性能

PostgreSQL

PostgreSQL 在各种规模的数据集上,都有优秀的速度和性能,并且在在线事务处置(OLTP)和在线剖析处置(OLAP)速度方面通常优于其余数据库。它提供了多版本并发控制 (MVCC),可同时处置多个事务,死锁比 SQL Server 少。PostgreSQL 提供了许多工具和参数,准许用户监控和提升数据库性能。

SQL Server 以其剖析和事务处置的速度而闻名。但是,由于 SQL Server 用户协定,制止在未经 Microsoft 事前书面同意的状况下颁布基准测试,因此很少与其余数据库系统启动间接比拟。SQL Server 在提升性能和速度方面有一个突出的性能:In-Memory OLTP,它应用了内存数据表的长处,访问性能优于间接写入磁盘。SQL Server 规范版在内存、分区、索引方面存在一些性能限度,还有一些性能要求更新到企业版。

并发

PostgreSQL

PostgreSQL 具备完善的多版本并发控制(MVCC),可同时处置多个环节。MVCC 提供数据库消息的快照,以防止显示由并发事务或其余数据库系统中的数据锁定惹起的不分歧。它支持可序列化快照隔离(SSI)来保障事务隔离。

SQL Server 的多版本并发控制系统开发得不太成熟,自动状况下,它依赖于数据锁定来防止并发事务出错。为了提高性能,它成功了失望并发。此方法会跳过行锁定,而是在假设抵触很少出现的状况下,依据缓存版本验证任何更改。

运行畛域

PostgreSQL

PostgreSQL 是环球上最先进的开源数据库。环球企业都在经常使用 PostgreSQL 处置关键业务负载。PostgreSQL 社区和一些公司不时在确保 PostgreSQL 继续在环球范围内拓展运行。

SQL Server 在依赖 Microsoft 产品的企业中很受欢迎。在过去的二十年里,随着 Microsoft 经过其 Windows 主机推进它,它的市场份额有所参与。但是,随着近年来越来越多的企业转向开源,SQL Server 的盛行度曲线变得越来越平整。

环境和技术栈

PostgreSQL

PostgreSQL 在 LAPP 技术栈(Linux、Apache、PostgreSQL 和 PHP/Python)中很受欢迎。LAPP 技术栈越来越受欢迎;Amazon 和 VMware 等大型平台服务提供商都经常使用现成的 LAPP 技术栈模块提供服务。

SQL Server 是 Microsoft 技术栈中的罕用组件。它包括 Microsoft WPF、ASP.NET、SharePoint 和 Office 365 等 Microsoft 技术。

调度义务

PostgreSQL

PostgreSQL 不像其余 SQL 数据库那样提供内置的义务调度程序。活期义务要求外部工具,如 Linux 上的 pgAgent、cron 或 pg_cron,以及 Windows 上的 Task Scheduler 或 SQLBackupAndFTP。

SQL Server Management Studio 可在 SQL Server 中调度义务。

访问方法

PostgreSQL

PostgreSQL 可支持如下访问方法、协定和 API 以访问数据:ADO.NET、JDBC、ODBC 和原生 C 库等。它还支持用于二进制大对象(BLOB)的流式处置 API。

SQL Server 支持如下访问方法、协定和 API 以访问数据:ADO.NET、JDBC、ODBC、OLE DB 和 TDS 等。

批量搜集和绑定

个性

PostgreSQL

SQL Server

批量搜集

PostgreSQL 没有用于批量搜集的语法,也没有任何凑近的等效性能。相反,假设在单个 SQL 语句中上班,则可以经常使用 PL/PgSQL 代码创立暂时表,或经常使用公共表表白式(CTE 或 WITH 查问)。

SQL Server 中没有用于批量搜集的语法。一种代替方法是经常使用暂时表和游标。

绑定

与 Oracle 等其余相关数据库不同,PostgreSQL 不支持绑定变量。相反,PostgreSQL 可经常使用 PREPARE 语句来成功相似的结果。

SQL Server 支持绑定变量。SQL 语句中的每个参数标志都必定经常使用SQLBindParameter函数绑定到一个变量,而后才干口头该语句。还可以将一个 SQL 语句的参数绑定到程序变量数组,以启动批量处置。SQL Server 还支持定义存储环节参数的称号。

同义词

SQL Server 支持同义词。同义词提供了一个形象层,用于防止客户端运行程序对基础对象做出更改。同义词属于一个形式;与形式中的其余对象一样,其称号必定是惟一的。仅支持按称号绑定;假设修正、删除或交流基础对象,则只能在运转时发现缺失的援用。PostgreSQL 不支持同义词。

您可能还会对下面的文章感兴趣: