The Unreasonable Effectiveness of SQL

in with 0 comment

The Unreasonable Effectiveness of SQL

看起来很不合理但超级有效的 SQL

原文地址

许多年前,两个来自 IBM 的年轻人提出了基于数据库的一种新的语言,通过关系构思,致力于简单声明并操作数据。自从 Don Chamberlin 和 Ramond Boyce 发布 SEQUEL: A Structured English Query Language 这些年来,关系型模型和 SQL 已经被应用到很多重大的技术:OLTP, OLAP, 对象数据库,对象关系型数据库,甚至是 NOSQL。SQL 启发了很多非关系型数据库的查询语言设计:对象数据库的 SQL,对象关系的 SQL,XML的 SQL,空间的 SQL,搜索的 SQL,JSON 的 SQL,时间序列的 SQL,流的 SQL 等等。每个 BI 工具使用 SQL 进行与数据交互。事实上 SQL 是最成功的第四代语言

SQL is a device whose mystery is only exceeded by its power. Lukas Eder

正如 Don 最近所说,SQL 是代数数学的基础,它的目标是通过以下提供的类似英语的查询语言简化它:

正当大数据尝试取替代数据存储的关系系统时,它们却说着同一种语言:SQL。Hive, Impala, drill, BigSQL 那些被 SQL 启发过的语言,优化器还有类似于 SQL 的 MPP 执行。他们还会定期的添加 SQL 功能。正如你能想到的所有数据类型及模式。数据存储分离,数据模型和查询执行通过 SQL 得到了显著的优化。在 SQL 推出的 45 年间,许多数据库来了又走,许多数据处理也来了又走。许多 NoSQL 运动中的人暗示,即使在不经意间,就会有 SQL 与 SQL 数据库的死亡。SQL 阵营大步迈进, Don Chamberlin 最近表示:“当一个语言被很好的认可,其它的语言开始将自己定义为不是这个语言,它必须做的非常好。”

另一方面,数据库有一部分是 NO-SQL。虽然最初的定义是“Not Only SQL”,最初的设想是不需要 SQL 并且尝试如 map-reduce 取替代它。十年过去了,许多流行的 NoSQL 数据库都有 SQL 的变体:Couchbase 中的 N1QL,Cassandra 中的 CQL,Elastic中的 ElasticSearch SQL。有人说,“MongoDB 没有 SQL”。我说,“仔细看,你会发现很多简单化的 SQL 实现。”通过在 MongoDB 使用简单化,过程化和临时设计,松散的查询组合,优化和使用 SQL 完成的创新。

虽然关系模型已经非常成功了,但数据库开始支持更多的数据模型:JSON,图形,XML,时间序列,空间,宽列,柱状,文档等。大多数数据库有它们自己版本的 SQL。N1QL 是 JSON 的 SQL; SQL / XML,来自 InfluxDB 的SQL,SQL / Spatial,Cassandra中 的 CQL 等等。甚至是 NoSQl 数据库也实现了 SQL 和被 SQL 启发的语言。甚至在最新的数据科学世界中,强烈建议学习 SQL 技巧

Now, there are more SQL projects in NOSQL databases than SQL databases.

Data models/formatsSQL implementation
JSONCouchbase N1QL: SQL for JSON
Wide columnCassandra CQL
Hadoop/Big DataHive, Impala, Drill, BigSQL
TimeseriesInfluxdb
GraphSQL Graph Database, Oracle Graph
NoSQL databaseApache Phoenix
SpatialOracle Spatial
SearchElastic SQL

为什么 SQL 会如此成功呢?

  1. 声明性:你声明输出,查询引擎就会通过最佳的方式执行这条查询。优化器,特别是基于 1979 Pat Selinger 发明的,帮助不断提高性能。
  2. SQL 不仅仅用来查询,还可以用来更新数据,事务,存储过程,UDF 通过将过程语言与声明性 SQL 结合起来扩展了范围。
  3. SQL 具有可塑性。它已经多次标准化,每次都会添加一本书的功能,一商店的语法,以及一字典的关键字。当然,不是所有的 SQL 都是相同的。即使是 RDBMS 上的传统 SQL 实现也不完全兼容,除非您小心地将 SQL 编写为兼容。通过所有这些,SQL 的原始精神仍然存在。一个 SQL 演化的例子是 SQL++ 。Don Chamberlin 和 Mike Carey 讨论了支持复杂数据格式的必须性,使用户和开发者可以轻松访问 JSON 中的数据。Don 的书 SQL ++ For SQL Users:A Tutorial教你最近SQL ++的发展,这是为灵活的JSON数据模型上的数据处理而设计的语言,但是以SQL兼容的方式。
  4. SQL,正如它借用的英语一样,对新数据类型,访问方法和用例的新思想和扩展持开放态度。
  5. SQL 在数据上的独立性已经被用于很多非关系型数据: CSV,JSON 和全部大型数据格式。一些人将关系数据与 SQL 强关联。事实上,在给定模式下,SQL 允许你 select-join-group-aggregate-project 任何数据格式。

SQL 评估

现在 SQL 在我们工作中随处可见,但还需要在不同功能上去评估优化它。

  1. 找出每个工作的负载和目标,比如交互式应用,交互式分析,批量分析或 BI 工作负载等等。
  2. 支持的声明反映了业务能力。
  3. 表达式(标量,聚合,布尔),连接(inner, left / right / full outer),子查询,派生表,排序和分页(LIMIT / OFFSET)的语言功能。
  4. 索引:没有 SQL 的索引就如同一个图灵机原型。
  5. 优化器:重写查询,选择一个最佳的访问路径,创造一个最佳的访问路径是 SQL 成为最成功的第四代语言的重要原因。有些具有基于规则的优化器,有些具有基于成本的优化器,会有基于两者的优化器。评估优化器的质量至关重要。典型的基准测试(TPC-C,TPC-DS,YCSB,YCSB-JSON)对您没有帮助。
  6. 俗话说:“数据库中有三样非常重要的东西:性能,性能和性能”。衡量工作负载的性能非常重要。 YCSB 和扩展的 YCSB-JSON 将使评估更加简单。
  7. SDKs: 丰富的 SDKs 和语言支持会加快你的发展。
  8. BI 工具支持:对于大数据分析,BI 工具通常需要标准数据连接驱动的支持是非常重要的。

N1QL 的创建者 Gerald Sangudi 曾说过,SQL 是成功的,它代表了数据处理的基本操作。SQL 支持丰富的操作集合:select-join-nest-unnest-group-aggregate-having-window-order-paginate-set-ops。这就是我们或机器在操作数据时的想法吗?虽然有待观察,但其他语言如 python 和 Java 正在为那些数据操作添加操作符。或许,还会有其它什么取效仿。SQL 已经走到了关系模型没有的地方。可以毫不夸张的说:

SQL 已经死了。SQL 万岁