(六)集算器不兼容SQL

集算器能不能提供兼容SQL的语法?这是一个经常被问到的问题。

SQL有巨大的用户群,如果集算器能够兼容SQL的语法并提高性能的话,这样就可以直接把原来SQL的代码迁移过来,而且程序员可以继续使用已经熟悉的SQL写代码,看起来好处很多。


但是,很遗憾,这件事做不到!

集算器不能基于关系代数来实现SQL。SQL难以获得(开发和运行的)高效率,本来就是关系代数造成的。这个问题是理论性的,不可能通过工程上的优化来解决。想获得高效率,就必须放弃关系代数。

如果使用集算器的内核来解释SQL呢?理论上是可能的,解释或移植SQL是有不少工作量,但并不是非常困难。不过,这样只能获得语法的兼容性,并不能得到高性能。高效的代码要针对运算模型的特征去编写,而SQL语法中并没有体现这些信息,一定要把SQL移植过来,仍然会面临许多工程层面优化问题,没办法做得最优效果。事实上,两种均采用SQL的数据库,要让其特有的语法能够互相解释和移植,在不影响性能的前提下都是很难做到的。


也没太大必要再去兼容SQL。

许多程序员认为SQL更简单易学,这其实上是个伪命题。

SQL用于做基本查询确实很简单,它的语法风格还很象英语,很容易理解,这就造成了SQL简单易学的假象。但是,实际工作中耗用编写时间较长的查询,或者说集算器试图解决的过程式计算问题,用SQL写起来都非常繁琐,动辄三百行五百行,甚至数千行,而且经常一条语句就这么长,不仅书写理解难度很大,维护也很麻烦,过两月自己都看不懂。三行五行的简单SQL只存在于教科书和培训班中,而实际工作中的我们在谈论复杂SQL的长度时都是论K而不是论行的。

对于这类问题,继续采用SQL实在不是好办法,不仅写起来难,运算性能也不佳。而直接用集算器语法则会在大多数情况有全面的效率提升,付出这点学习成本还是值得的。


当然,运算比较简单的情况使用SQL确实会方便。为此,集算器也提供了简单SQL(不嵌套,无过程)的兼容语法。不过,对于数据库中的数据,这类简单运算也没必要使用集算器,但是,如果涉及库外计算时就无法利用数据库的SQL能力了,这时候可以使用集算器的兼容SQL语法针对文件等非数据库数据集进行简单的SQL式查询。