2.2 不过,如果PostgreSQL的作者挂了怎么办?假如MS SQL Server的作者同样屎掉了会发生什么——结果是一点事没有。当然了,没啥说的“PostgreSQL的作者”和“MS SQL Server作者”一样毫无意义。根本就没有这回事。 有个前辈,是一个IT基础设施监管人到是问过我这个问题(是关于Hadoop,不是PostgreSQL)。大家好像对所有的开源软件的认识都有误区,就好像这些软件是躲在妈妈的地下室的独行侠写的一样。这显然不是真的。大型开源项目如PostgreSQL和Hadoop是由拥有高级技能的开发者团队所写,他们经常受到商业赞助。在它们的核心,PostgreSQL的开发模式就像MS SQL Server的开发模式一样:有某个组织向一个大型程序员团队支付报酬。不会有单点失效的问题。 但是两者至少有一个重要的差异: PostgresSQL的源码是开放的,因此大批高级程序员能够进行代码走查、代码优化、贡献代码、提高代码的质量并理解代码的逻辑。 这是PostgresSQL为什么比MS SQL Server更好的一个原因。 关键一点,由于开源软件往往由那些非常关心代码质量的人编写(经常是由于他们打赌他们可以保证软件尽可能好用),因此软件开发通常采用最高的标准( PostgreSQL, Linux, MySQL, XBMC, Hadoop, Android, VLC, Neo4JS, Redis, 7Zip, FreeBSD, golang, PHP, Python, R, Nginx, Apache, node.js, Chrome, Firefox...)。 另一方面,商业软件通常由某一委员会设计,在公司的格子间里开发,并且编码的时候通常没有适当的指导和灵感( Microsoft BOB, RealPlayer, Internet Explorer 6, iOS Maps, Lotus Notes, Windows ME, Windows Vista, QuickTime, SharePoint...)。 2.3 但是开源软件不安全、不稳定、不值得信任、不适用于企业级生产等等!这些东西都没法说。说这些的人都是些很无知的人,你应该忽视他们,或者你自我认为很大方,你可以教育教育他们。好吧,我认为我是一个大方的人: 安全:一个旧的误解是闭源软件更安全,我会简要总结几个好的原因(读一读这个链接吧,很棒):保密不意味着安全;开源审查相比闭源来说更有可能找到弱点;正确的审查开源软件很难或不可能在其中构建一个后门。如果你喜欢轶事、逻辑论证什么的,想想Microsoft Internet Explorer 6,一个曾经的企业级闭源商业软件,被广泛的认为是有史以来最不安全的软件。Rijndael算法,作为AES背后的算法,世界上的政府用来保护顶级秘密信息,是一个开放标准。在任何案例中,关系型数据库不是安全软件。在IT世界里,“安全”有点像美国的“支持我们的军队(support our troops)”,或纸牌中的王牌“想想孩子(think of the children)”,它可以否决其他所有,包括常识和证据。注意别上当。
2.4. 可是 MS SQL Server 能利用多个 CPU 内核处理单条查询!当你的查询语句运行时, 性能受限于 CPU 而不是 IO,那么 MS SQL Server 就比较有优势。但是在现实的数据分析中, 这种情况几百年也难得见一回。当这种少见,又特殊的情况使得 CPU 变成性能瓶颈的时候。依靠数据库系统是解决不了问题的。他们又不擅长数字密集运算。 当服务器需要同时处理多个任务的时候(服务器基本上都这样) MS SQL Server 就没有什么优势了。PostgreSQL 用的是多进程模式 -- 一个进程负责处理一个数据库链接,也就是说,它也用了多个 CPU 内核。当然, 具体怎么分配, 那是操作系统的事。 我怀疑,MS SQL Server 的自定义聚集程序集(custom aggregate assemblies) 用的也是这种并行查询机制。把聚集操作分配到多个线程中计算, 然后再将结果合并到一起,有点类似 MapReduce 的作风。 我还怀疑, 这就是为什么MS SQL Server 的聚集语句不能使用 ORDER BY 子句的原因。所以, 恭喜,PostgreSQL 也是可以利用多个 CPU 内核的。只是你不能使用基本字符串汇总(basic string roll-up)。 2.5. 我只会 MS SQL Server , 没用过 PostgreSQL!如果你宁愿继续使用那个臃肿, 笨拙, 不稳定的系统, 也不愿意花点时间, 学一门稍微有些区别, 但是又比较简单查的询语言. 那就求神拜佛, 别在下次面试的时候遇到我. 2.6. 难道数以亿计的 Microsoft 用户都错了?!这是以前和我一起工作过的一名资深的数据分析师问的问题. 我的回答是 "这世上有 1.5 亿 穆斯林教徒, 1.2 亿 天主教徒. 不见得他们全都对". 所以, 就算一亿个人都错了, 也没什么奇怪的. (这里指的是 2.7 亿个人都错了.) 2.7. 真要这么好, 怎么可能会免费!大家都喜欢这么说。 真是替他们感到可惜, 因为他们无法说服别人不为钱做事。 就当他们不知道,这世上还有慈善机构, 自愿者,和其他纯粹就是做点贡献的人存在好了。 这个观点, 还建立在另外一个荒唐的假设上--开源软件开发无利可图。 大型企业开之所以开放源代码,花钱请人开发和维护这些代码, 无非是能从中收益。设想下,如果你把代码开源给他人使用,别人就会给你软件免费修改 Bug,添加新功能, 审查代码,测试, 甚至宣传。如果你的产品做的足够好, 用的人也就会越来越多,自然就会形成被业界广为接受的标准。作为支持和发布该软件的供应商,你当然会在市场上占据相当有利的地位。 就算你是个利己主义者, 开源也是个明智的选择。比如说,我现在就自己花钱做网站,替 PostgreSQL 做宣传。可能 Teradata 或 Oracle 也不错。但是他们太贵了, 我用不起, 所以也就没有给他们宣传。 2.8 但是你存在偏见!好吧,我确实偏向于更好的数据库。本文的目的是演示,用事实说话。偏见是有理由的,或者更确切的说,这根本不是偏见,而是偏好。在任何案例中,PostgreSQL都是免费软件,所以我没有经济上的动机。我也没有给它写过什么(除了我提交过一次bug修复),所以这也不是我个人的问题。并且和我关系近的人中也没有一个参与PostgreSQL的开发与支持。我只是想用好的工具来把我的工作尽可能的干好。为什么会有如此多的疑问呢?? 2.9. 但是“PostgreSQL"是个愚蠢的名字!这是可以证明的;它相当的尴尬。容易发错音并且也经常被不正确的大写书写。人们选择工业软件时对”二逼名字“不格外顾虑倒不妨它是一份干得漂亮的活。 尽管如此,对SQL服务器来说,MS SQL Server是微软选择的所有可能名字中最没劲的一个。无论哪个词都有6到8个音节,这取决于你是否将"Microsoft"缩写和你是否将它念做“sequel"或"ess queue ell",一个产品的名字这也太长了点。虽然微软有一个非常非常长名字的产品-或许这是它一直以来最伟大的成就来了 Microsoft® WinFX™ Software Development Kit for Microsoft® Pre-Release Windows Operating System Code-Named "Longhorn", Beta 1 Web Setup 我数了数有38个音节。哇靠。 2.10.但是SSMS比PGAdmin要好点!它更流畅,必须的嘛。它也更好。它有代码自动完成功能—虽然我总是把这个功能关掉因为这个功能总是坏我事—而且每次它让我走出段名或表名的困局的时候,至少有一件它做的好的事,例如自动-”纠正“一个普通的SQL关键词”table"为一个微软的奇怪的玩意“TABULATION_NONTRIVIAL_DISCOMBOBULATED_MACHIAVELLIAN_GANGLYON_ID”或别的什么东西 事实上中止SQL并且看看GUI中的结果,PGAdmin很不错。它只是不华丽而已。 还有另外一个东西:psql。它是PostgreSQL的命令行SQL接口。它是真的真的非常好。它有大量有用的目录查询功能。它可以聪明的显示扁平化的数据。它还有tab键补齐功能,不像SSMS的代码补齐哪有,它确实有用,因为它是根据上下文感知的。打个比方,如果你键入 DROP SCHEMA t 并且按下tab键,它将会给你提供名称以“t”开头的schema(如果只有一个的话,就会自动补齐)。它也可以让你在文件系统中来回跳转,也可以使用像内联的vim那样特别强大的文本编辑器。它自动保留了已执行命令的列表。它还提供了方便的有用的数据导入导出功能,包括"COPY TO PROGRAM"这样的特性,利用管道和命令行提供了另一个级别的灵活性和数据控制能力。它灵活的使用屏幕空间。快速并且方便。你能够通过一个SSH链接甚至是较慢的链接来使用它。 唯一严重的问题是,对于那些害怕命令行和敲键盘,还想成为数据分析师的人来说有点不合适。 2.11MS SQL Server可以直接从Excel导入!是的。那又怎样?Excel可以输出到CSV文件(比较难得的是,微软Excel的CSV导出代码工作的挺好),PostgreSQL可以从CSV导入。当然了,多了一步。在分析平台中,能够直接从Excel导入是一个很重要的特性吗? 2.12PostgreSQL比MS SQL Server要慢!更确切的说应该是“MS SQL Server稍微更宽容,如果你不知道你在做什么的话”。 对于某些操作,PostgreSQL确实要比MS SQL Server慢,最简单的例子可能就是COUNT(*)了,在MS SQL Server中就是一瞬间的事(我是这么想的),在PostgreSQL中就需要全表扫描(这是由于它们使用的是不同的并发模型)。PostgreSQL是一个慢开箱即用产品,因为它默认配置是使用少量系统资源,不过对于任一系统都已经被调整用于处理大量工作,所以天生的开箱即用性能不是一个值得争论的事情。 我曾经看到过PostgreSQL因为慢而被批评,因为它在一个大型表中需要花很长时间来做一些巨大的、复杂的正则表达式操作。不过每个人都知道,正则表达式操作是一种非常昂贵的计算。在任一案例中,PostgreSQL的什么被用来做比较呢?当然不是MS SQL Server了,因为它做不了正则操作。 PostgreSQL支持非常聪明的索引操作,比如范围型索引和trigram索引,对于某一类操作来说比MS SQL Server有数量级的速度。不过只有你知道如何合适的使用这些特性才行。 你从最伟大的程序语言那里得到了巨大的灵活性支持,并且聪明的数据类型允许面向基于PostgreSQL的解决方案,它胜过基于MS SQL Server的解决方案好几个数量级。 查看我更早的例子。 无论如何,关于速度的争论不仅仅限于计算机的时间(执行时间); 开发人员的时间也是一样。 这就是为什么像PHP或者Python这么流行的原因, 尽管实际上C的执行速度比他们快。 虽然他们运行慢,但是他们开发更快速。 你要花一个小时编写可维护的,优雅的SQL就被允许运行一个小时, 还是花费三天写一个多bug的程序, 尽管它的工作时间只有45分钟?
|