SQL Server 2008 r2或PostgreSQL

18

我正在为公司重写一个应用程序,需要使用数据库。目前我们正在使用SQL Server 8,我将更新数据库。我的问题是要使用哪种数据库。我一直在研究SQL Server 2008 r2和PostgreSQL 9。

这个数据库将托管在Windows Server 2008服务器上,并将用于独立应用程序和用.NET编写的相关网站。

我关注的一些问题包括:

  1. 成本(显然PostgreSQL在这里获胜)。
  2. 它是否准备好了?我已经读到了一些有关它与SQL同样好的内容,但希望从使用它的人那里得到一些意见。
  3. 易用性。我非常熟悉SQL Server。我一直在尝试PostgreSQL,虽然它不同于SQL Server,但我正在逐渐掌握。
  4. 速度。PostgreSQL的速度和SQL Server一样快吗?
  5. 我能否使用ADO.NET (.NET 4.0)与PostgreSQL并获得与使用SQL Server相同的功能(将使用Linq或Entity Framework)?

我将不会将我们旧的SQL Server 8数据库转换为新的数据库,所以我不关心任何转换。

针对以上情况,我想知道人们对这两种数据库的看法,以及PostgreSQL是否是解决业务应用程序的可行方案。

TIA

Brian


这可能很有趣:http://datachomp.com/archives/top-10-reasons-i-like-postgres-over-sql-server/,以及这个:http://datachomp.com/archives/im-leaving-sql-server-for-postgres/。 - user330315
1
SQL Server是很好的,但价格很贵。容易陷入的情况是这样的:SQL Server Express是免费的,我们就使用它。然后你写了很多代码,你的应用程序也壮大了,你意识到Express已经不够用了。接着你发现有些客户也买不起它。这基本上是个死局:你要么重写整个东西,要么购买它。这就是为什么我建议选择PostgreSQL(虽然我根本没碰过它)。 - ren
5个回答

30
正如SteveG所指出的,SQL Server Express可能是你想要的。但是我广泛使用过SQL Server、SQL Server Express和PostgreSQL,你应该知道SQL Server Express除了数据库大小之外还有一些更严重的限制。
  • 安装需要管理员权限(并且需要系统重启 - 如果您想针对特定版本的数据库运行集成测试,或者有一个不需要管理员权限的应用程序需要运行,则不太好)
  • ReportingService Express只能连接到本地数据库
  • ReportingService Express不能使用除本地SQL服务器之外的其他数据源(没有ODBC)
  • 某些ReportingServices功能缺失(例如图表和CSV/XML导出格式)
  • 受限于使用1GB RAM(2008/2012版本相同)
  • 受限于单个CPU(新说法:限制为1个插槽或4个核心中较小的那个)
  • 没有行级安全性;仅在标准版和企业版中可用(即使标准版也有限制)
  • 没有表和索引分区
  • 没有索引视图
  • 没有数据库镜像
  • 没有数据库调优顾问
  • 没有通知服务
  • 无法发送电子邮件(如果您绝对需要,可以尝试使用CLR存储过程)
  • 无法使用/调用Web服务(新说法:没有HTTP端点)
  • 没有服务代理
  • 没有全文和语义搜索(必须安装Express高级服务)
  • SQL Server Express版本不包含Profiler工具(在GitHub上有SQL Express profiler
  • SQL Server Express不提供作业调度服务
  • SQL Server Express不提供数据导入和导出功能(必须安装)
  • 不包含SSIS

而且正如所说的
4GB数据库大小(在SQL 2008 R2和SQL 2012中提升至10GB)


请注意,10GB的限制既不是10GB也不是10 GiB(10 * 1024^3),实际上是10'240 MB(10 * 1'024 MB),这实际上只是我解释为10GiB(10'240'000'000*100/10'737'418'240)的10 GB的95%。
此外,还有一个限制,即Microsoft-SQL-Server只能在Windows上运行(目前为止,SQL-server的Linux版本正在开发中,但目前只是CTP版本,而且没有BI功能)。
因此,还有一些常常被忽视的要点:
- 在Windows 7中,您最多只能有20个并发连接。如果您需要更多连接,您将需要将SQL Server安装到Windows Server操作系统上。这意味着,如果您在使用情况中的SQL-Server Express有超过20个并发用户,您仍然需要一个Windows Server许可证(连接数与SQL Server版本无关,而与操作系统有关)。在达到1GB RAM瓶颈之前,您可能会遇到性能瓶颈。
- 如果您想节约成本,您将需要在同一台服务器上运行数据库引擎和Web服务器,这将导致所有相关的性能损失。

现在来谈谈你的观点(按重要性排序)
5. 是的,有Npgsql.dll(MIT许可证),所以不需要ODBC
但是:如果你的代码在各个地方都使用System.Data.SqlClient(例如参数,尤其是在代码中到处复制粘贴),那么你将不得不重新编写不仅仅是SQL代码(使用System.Data.Common中的抽象类,或者System.Data.IDB*接口)。
如果你的代码到处复制粘贴SqlClient,可以说它需要重写。

  1. 易用性:
    比SQL Server多一点学习曲线,但总体上并没有太大区别。 如果你习惯了SSMS,pgAdmin可能无法满足你的要求,但还有其他几个管理和开发工具可以使用(例如Navicat),它们非常接近SSMS甚至超越它。
4. 速度。PostgreSQL和SQL Server一样快吗? 是和不是。实际上,它可能更快。诚然,由于SQL Server在查询优化器方面做了很多工作,与SQL Server的企业终极版本(或者当前的顶级版本的名称)相比,PostgreSQL可能会稍微慢一些。 但是,谁会有那个版本呢?如果你可以在PostgreSQL上使用所有的CPU、所有的核心和所有你想要的内存,那么无论SQL Server是一个削减版的Express或Standard版本,只有1个CPU和1到几GB的内存(据我所知,Windows限制你在64位上使用64GB内存,而在Linux上,即使在32位处理器上,你也可以超过每个应用程序4GB内存的限制,并且可以在32位处理器上寻址64GB内存,更不用说64位的限制了),无论SQL Server的查询优化器有多么超级优化,你都会比它快。话虽如此,根据我使用过pg和ms的个人经验,PostgreSQL有更好的查询优化器,但这只是我的个人观点,我没有数据来支持这一点。此外,Windows(Windows 7)是一个慢速的操作系统(再次强调,这只是个人观点,没有数据来支持)。所以当你可以让PG在无头模式下运行在Linux上时,它几乎肯定比SQL Server更快,即使是企业终极版本。
内存占用 你可以完全配置PostgreSQL。你负责配置文件。 根据你的设置如何调整,它可以是小的或大的。与在Windows上以相同速度实现与SQL Server相同的功能相比,整体PG的内存占用要低得多,尤其是在Linux上以无头模式运行时(没有服务器GUI)。
成本 显然,PostgreSQL在这方面胜出。 不要忘记:我们讨论的不仅是服务器许可成本,还有操作系统和远程访问(例如,在Windows上与免费SSH访问相比,额外的非常昂贵的Citrix许可证)。 还有一件事:PostgreSQL是开源和免费的。如果你将其与SQL Server进行比较,你不应该将其与SQL Server的终极企业版(和Windows Server)进行比较,而是与你实际上能够负担得起的版本进行比较。然而,PostgreSQL将始终是一个免费的终极全包全免费全开源BSD许可证版本。如果你将PostgreSQL的功能与Sql-Server的终极企业版进行比较,你还必须将成本与终极企业版进行比较(在99%的情况下,你会发现它不值得这个价格)。
2. 它准备好了吗? 实际上,Skype和WhatsApp都在使用PostgreSQL作为他们的数据库。 你会发现当你尝试运行一个50+ MB的插入脚本时,它会有一些问题(错误消息不好 - 连接断开),但是Microsoft的SSMS在那之前就会崩溃。
总而言之,PG可能比SQL Server更适合PrimeTime。
PG现在已经有了分页功能,已经有了将近10年的历史了(MySQL以及符合SQL标准的语法),而SQL Server直到SQL-2012才刚刚添加了这个功能,而且只是符合标准而已。
你可以简单地使用xcopy部署PostgreSQL,完全不需要管理员权限,非常完美。
PG支持XML,就像SQL Server一样(而且在PG上,你实际上可以在计算列定义中使用xml函数,而在任何版本的SQL Server中都不行)。
PG支持JSON,SQL Server呢?我相信他们仍然完全投入于认为XML是未来的,并且故意削弱了Web作为一个平台的能力(虽然他们现在正在为SQL Server 2016 CTP添加JSON支持,但它将数据存储为nvarchar,所以你将无法在特定的JSON字段上设置(全文)索引,就像你可以在PostgreSQL上做的那样)。
PG支持HSTORE(关联数组列),而SQL Server不支持。
PG支持数组列。数组是编程的核心部分,除了在SQL Server中,它们不存在(尝试将IN子句参数化或过滤循环递归)...
PG长时间以来一直支持空间支持,SQL Server的空间支持相对较新,并且依赖于.NET扩展,并且是面向对象的(你好,关系数据库?)。
PG拥有更好更快的全文搜索(个人观点,没有数据支持,因为这是显而易见的,就像Google Chrome比IE 8更快一样)。
PG有公司提供商业支持,就像Microsoft为SQL Server提供的一样;优势在于你实际上可以通过PG支持来修复你的错误/功能请求。你可能知道Microsoft的支持,所以我就不再多说了...
PG支持IPv6,Microsoft呢?
PG在重负载下表现正常,而在Windows上的SQL Server上,我们遇到了一些奇怪的问题,这些问题会随机出现和消失(海森堡?)。
SQL Server至今仍然默认使用悲观并发,而PG不是。
开箱即用的压缩。在SQL Server中,压缩是一项“企业版+”功能,这意味着你至少要花费一个开发人员的成本才能使用压缩功能。一旦你支付了这个能力的费用,你仍然需要弄清楚如何实现它。Postgres会自动免费为你完成这项工作。
并发索引创建。这是SQL Server能够做到的另一个功能,但前提是你能够负担得起企业版。Postgres在这方面帮你解决了问题,你可以把钱包留在家里。
可索引函数 - 可搜索性。在Postgres中,你实际上可以为某些函数创建索引并保持可搜索性。而在SQL Server中,BOOM - 表扫描 - 性能再见。
PG默认使用Unicode(UTF8)。以前,一个无能的前任可以通过可怕的varchar和缺少字符串数据类型的N'来瘫痪整个应用程序,就像他们在SQL Server中所做的那样。不过,N'语法仍然有效,所以如果你使用它们,就没有兼容性问题。
PG支持递归级联删除,而SQL Server根本不支持(尽管它在你想在引用约束上放置级联时会主动告诉你)。
PG支持GREATEST(value [, ...]),LEAST(value [, ...])。
Microsoft:CASE WHEN HugeExp1 > HugeExp2 THEN HugeExp1 ELSE HugeExp2 END)... CASE WHEN N > 2 THEN 'ROYALLY SCREWED'...或者这个非常易于维护的宝石:SELECT(SELECT MIN(Price)FROM(VALUES(123),(456))AS AllPrices(Price))。
PG从一开始就支持UTF-8 CSV文件,而SQL Server在SQL-Server 2014 SP2之前不支持UTF-8 CSV文件(尝试导入MaxMind GeoIP数据库 - 你需要为SQL Server编写自己的程序...)。

PG的缺点:
  • Windows版本不如Linux版本稳定和快速。

  • 没有像SQL-Server-Reporting-Services那样的免费BI工具(好吧,有Eclipse BIRT,但它运行在JAVA上)。 另一方面,花一点钱你可以得到stimulsoft报表,它比SSRS有更多的导出格式,并且在除了IE以外的浏览器中也能正常渲染,而SSRS(2005-2012到目前为止,据我所知SSRS 2014与2012没有区别)不能。

话虽如此,如果你唯一的问题是SQL-Server Express的全文搜索,你应该看看Lucene.NET(Apache许可证)。

此外,如果你打算在生产环境中使用SQL-Express,请小心。

迄今为止,我们只考虑了一些最明显的限制,但关键是,看似一个由可观的成本节约驱动的好主意可能最终对你的业务来说是一场绝对的灾难。更糟糕的是,你通过使用免费产品获得的初始成本节约可能很容易被灾难恢复的成本和数据库停机期间对你的业务声誉造成的损害所抵消。因此,不用说,尽管 SQL Server Express 的零成本价格很吸引人,但绝对不是适合为你的业务提供动力的数据库解决方案。

6
我必须说,你的观点有些偏见。虽然我承认我使用过"MSSQL企业终极版",但我也用了Pgsql和SS多年,不得不说P一直给我带来更多的麻烦。在M中,我只需要担心良好的磁盘I/O和明智的模式/索引。而在P中,我常常不得不浏览配置设置,以弄清为什么它这次会变得慢。我只想要一个能够工作并让我继续其他工作的东西。此外,与Express进行比较是不公平的。它不是作为一个完全成熟的竞争对手,而是一个轻量级的数据库,通常被嵌入到其他应用程序中。 - Basic
4
@Basic: 实际上,Express 是为那些无法负担或不需要任何更高版本的人准备的,比如学生、创业公司、小企业。嵌入式版本是 SQL CE,而不是 Express。此外,PG 配置非常非常保守(最低公分母)。该配置没有针对您具体系统进行调整。但是,您可以运行pgtune -i postgresql.conf -o postgresql-tuned.conf,它会自动解决这些问题。然后在维基中有一个专门的页面用于调优:https://wiki.postgresql.org/wiki/Performance_Optimization。 - Stefan Steiger
1
抱歉,我在CE上犯了错。我很累,想错了。至于调优,pgtune远远不足以使其在企业规模下运行良好。我目前有一个系统在Fat Twin上运行,但在9M记录表上只能做到每秒约300次更新(Postgres XC在4个节点上,RAID 10中的磁盘,512GB内存)。我们浪费了一周时间来尝试调整它,然后请顾问来调整它,但仍然无法像MSSQL那样获得850+/s的性能。我并不是说它对某些情况没有用处,但绝对不是所有情况都适用。 - Basic
4
@Basic: 你在哪里看到人身攻击了吗?我可能暗示你没有做好功课,但显然你的系统比我想象的复杂得多。600与300似乎差别很大。你确定你的问题与ORM框架(如Entity)或数据压缩无关吗? - Stefan Steiger
1
同样地,抱歉说话有些刻薄。太晚了/太累了。这里不值得深入探讨,但上述问题是由于 I/O 绑定引起的(在两种情况下都是如此)。看起来 MSSQL 在做一些聪明的事情(也许是批量写入?)。至少,在相同操作中,它在磁盘上寻找的次数更少。关于压缩的有趣建议(TOAST,对吧?)听起来可能是罪魁祸首。我有多余的存储空间,但我需要的是性能。好的一面是,这意味着我可以使用一些 Fusion IO 卡作为临时措施,所以一切都有好的一面。感谢您的建议。 - Basic
显示剩余8条评论

8
这真的取决于您的数据库大小和个人喜好。
SQL Server Express版是一个完全功能的免费数据库,最大支持4GB的大小;对于大多数小型到中型应用程序来说已经足够了。(顺便说一句 - 在我看来,微软的许可证是开源社区有史以来最好的事情!!)
PostgreSQL是一个完全功能的免费数据库,没有4GB的限制 - 但是,PostgreSQL遵循Oracle风格的SQL和数据库管理。如果您对此不熟悉,可能会遇到一些问题。
将Dot Net加入其中会增加一些不可忽视的复杂性。
1. 您可以在PostgreSQL上使用.Net吗?是的,但是Dot Net在与SQL Server配合使用时效果更好。 2. 您是否熟悉编写复杂的ODBC接口代码?如果是,那么PostgreSQL仍然是一个选择。如果不是,您最好选择SQL Server。
第三方编辑:
关于Dot Net的最后几点已经不再适用。
连接到PostgreSQL有不同的选项。对于Ado.Net来说,有不同的连接方式
dotConnect SQL Relay Npgsql

+1 是因为提到了 Express 版本。另一个问题是关于过程性语言和额外的学习曲线(T-SQL、PL/pgSQL 或其他类似 PL/Python 的语言不兼容)。 - Grzegorz Szpetkowski
37
记录一下,没有必要写“复杂的ODBC接口代码”。相反,你可以明智地使用一个PostgreSQL的ADO.NET提供程序- http://npgsql.projects.postgresql.org/ 虽然我对SQL Server非常了解,但这个回答的部分是完全错误的。 - anon
5
SQL Server 2008 R2 Express 的数据库大小限制为10 GB。 - Carlos Blanco
同Jeremiah所说,有很多ORM可以使用,而且纯SQL也可以通过ADO正常工作,对于每个可想象的编程平台,如Java/.NET/python等都有大量的驱动程序可供选择。没有理由不使用Postgres。 - Richard Todd
我还要补充一点,即Sql Server Express仅利用一个核心。 这可能在达到10 Gb限制之前成为瓶颈。 - ren
显示剩余3条评论

4
从我个人的经验来看,我发现PostgreSQL在Linux系统上运行更好 - 放弃Windows操作系统。虽然我不太熟悉SQL Server,但我在使用Postgres时没有遇到速度或灵活性方面的问题。虽然我无法谈论ADO.NET,但我在实际应用中(在持续负载下)使用Postgres取得了很大成功。在您的情况下,我唯一能看到的变量是与ADO.NET的集成。http://www.devart.com/dotconnect/postgresql/可能是一个起点。

4

正如一些人上面提到的,这实际上取决于你的数据库有多大。

特别是CPU核心和该核心许可证的差价真的很大。在这种比较中,CPU几乎不需要成本。 因此,如果您需要16个或以上的核心,我建议尝试使用Postgres。 您将能够用节省下来的钱购买更多的核心来为您的Postgres服务器提供支持。

我是软件开发人员,我们的客户必须为SQL Server许可证支付比所有其他东西加起来还要多的费用:软件开发、客户端硬件、服务器硬件、数据库管理等等。

大多数时候,购买新硬件比优化代码更便宜。但对于 SQL Server CPU 来说并不是这样。

(然而,您仍然可以投资于RAM /硬盘而不会增加许可证成本)


+1 我同意“为了购买SQL Server许可证而花费的钱比其他所有东西加起来都要多”,以及“大多数情况下,购买新硬件比优化代码更便宜”。 - A-K

3
我没有尝试过使用ADO.NET连接PostgreSQL,但是从我使用MySQL的经验来看,如果你计划使用LINQ to SQL或Entity Framework,最好还是坚持使用SQL Server。虽然可能有第三方库可以让你将这些技术与PostgreSQL集成,但我认为你会发现使用SQL Server会更加顺畅。几乎所有内置于Visual Studio中的便捷工具都只支持SQL Server,这些工具使得使用这些技术变得非常容易。

1
许多功能可以与外部工具和软件配合使用,但微软并不希望人们这样做。 - Sqeaky
1
@Sqeaky 更确切地说,没有人愿意花时间让工具与其他数据库完美结合。不要因为微软没有投入时间支持您喜欢的[任意技术]而责怪微软。自己添加支持。这不就是离开微软生态系统的美妙之处吗? - Basic
@basic 我的意思就是字面上的意思。微软希望企业和个人购买他们的“整个堆栈”,并且不希望在许多但不是所有情况下存在兼容性问题。 - Sqeaky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接