分享

趣谈sql系列之一:一文读懂sql的发展史 – 金丝燕网

 一本正经地胡闹 2019-07-22

如果说关系数据库作为上世纪计算力领域最为重要的发明之一,我想是不为过的。数据库的出现,为很多商业都提供了坚实的基础,也养活了形形色色的人。数据库的开始以IBM Almaden研究院的SystemR和加州伯克利大学的Ingres作为开端。前者最后变成了IBM的DB2,后者商业化以后还是叫做Ingres。

与此同时,还有一个叫做Larry Elison的人,看到了IBM的论文,自己创了个业。创业后和商业化的Ingres以及DB2展开PK。Larry Elison的公司Oracle赢得了这场战争。Ingres被卖以后,其作者Michael Stonebraker又搞了Postgres。这个系统现在成为了最著名的开源数据库之一。当然很多很多年以后Michael Stonebraker获得了图灵奖。到底Larry赢了还是Michael赢了,没人说得清楚。

据说Larry Elison的Oracle赢得了这场战争的原因,是因为他宣传自己的产品支持IBM DB2推的查询语言SQL,而Ingres则坚持用自己发明的,号称更好的查询语言。所以不管数据库领域怎么样变迁,SQL成了最大的赢家。

SQL是IBM的Donald Chamberlin和Raymond Boyce发明的。后者因为动脉瘤英年早逝,前者则享受了SQL的大部分荣光。SQL是structured query language的简称,恐怕也是这个世界上使用的最多的计算机语言之一。

当初设计SQL的人接受采访表示关系代数非常复杂,发明SQL是为了给人类提供一个简单的查询方式。查询人只要告诉系统自己想要什么就可以了,怎么做就让系统自动化的高效的去搞定。

换个暗黑一点的说法,就是普罗大众都是笨蛋,只能使用比较傻瓜的SQL,而如何让系统查起来就交给做数据库系统的神仙们去做吧。这催生了数据库系统里面一门非常重要的学问:查询优化。有关查询优化的故事可以讲上几天几夜。

初识SQL的人都会为它简单的SELECT...FROM...WHERE所迷惑,觉得这是世界上最简单的语言。然而错觉在于,这种简单的语言只能解决10%的问题。一旦SQL开始用上子查询,NOT IN, EXIST,乃至Windowing Function等许多更高级的语法的时候,为了理解其语法特点,把相关的问题和这些东西关联起来,简直是对人类智商的践踏。

你不信,看个简单的例子。表T如下所示,请查出直接和间接汇报给李四的所有员工。
-------------------------------------
|   员工      |     领导             |
-------------------------------------
|   张三      |     李四             |
|   王五      |     李四             |
|   大毛      |     张三             |
|   二毛      |     李四             |
|   小明      |     大毛             |
|   ......       |       ......            |
---------------------------------------
懂SQL的不妨来写写。我想写了之后你一定不会说SQL是个好东西了。

不但如此,SQL的有些行为还让人非常的匪夷所思。举个简单的例子:
SELECT COUNT(*) FROM T;
SELECT COUNT(*) FROM T GROUP BY 1;
如果T是一张空表的话,你觉得1返回什么?2返回什么?

答案是1返回一条记录0,2则返回一个空表。熟悉查询优化的人知道,查询优化有一条rule是说GROUP BY里面有常量的话,拿掉常量不影响整个查询。那么这个地方把唯一的常量拿掉了之后怎么就不一样了呢?

除了这两个问题以外,SQL还以莫名其妙的慢著称。我明明写的查询是对的,怎么这个查询跑半天也跑不出来。找另外一个人换一种写法,就能跑出来了。这样的问题比比皆是。所以这个当初为了让大家使用简单而设计的语言,一方面确实骗了大量的人入坑,另外一方面,又让进到坑里的人爬不出来。

这个问题在商业世界的解决方法,除了不断提高查询优化器以外,还出现了著名的DBA们。早年阿里巴巴用Oracle的时候,国内一群牛逼人士,都是Oracle的DBA高手。DBA的工作就是通过调整Oracle开放的各种各样的Knob,让这个公司里面跑的那些特定查询快起来。从这个角度来说千家企业千家数据库。虽然都是Oracle,其实都不太一样。

也有不信邪想要自动化的,比如微软的SQL Server就不怎么开放内部参数。结果就是自动化没怎么自动化,性能还是上不去,只能沦落到给中小企业用,登不上大雅之堂。也因为定制化的原因,有些公司干脆就用开源的mysql,这个轻量级的模块化的数据库,因为可定制程度更高,很多东西甚至可以在应用程序里搞定。当然能用好mysql的对公司的IT水平要求更高了。

有人可能会问,这和写SQL的人有什么关系呢?关系大大的了。无论在哪里,会写SQL都是个稀缺资源。我说会写SQL不是会写SELECT FROM WHERE,是能写除高性能跑得快的SQL的人。要不然为什么国内外DBA都那么贵呢?

数据库厂商们也提供了一个叫做explain的功能。这个功能的主要任务,是把你写的SQL经过查询优化以后的执行计划给你打印出来让你看看。很多人是看不懂的。但是最低底线,不妨碍人对数据库前后两个版本的查询计划做个比较,看看是不是因为查询计划变了所以新版本某个特定SQL慢了。有些数据库干脆提供了功能,把输出的查询计划直接绑定给一个特定的SQL,一劳永逸的解决变慢的问题。但是这种做法也失去了让查询变得更快的可能了。

很多人问我,自己懂一点SQL,想知道怎么样写SQL才比较快。我推荐过一本书:数据库系统实现。这本由斯坦福大学出版的书,是市面上唯一一本详细介绍数据库系统实现,解释如何从一个SQL语句变成查询结果的书。现在中文版和英文版都有了。我更习惯看英文版一些。每个会写SQL的人,或者不管会不会写SQL的程序员都应该好好看看这本书。

参考:公众号《飞总聊IT》

转自 http:///archives/3278

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多