大道至简 出奇制胜
----分布式数据库SQL解析经验之一
李万鸿
解决复杂的问题,需要高超的智慧,任何复杂的问题都可以用简单的办法加以解决,只要明确需求,化繁为简,找到原理和规律,就能巧妙地破解难题,正所谓大道至简,出奇制胜。在oracle分布式数据库sql解析中,我就运用了这个原理,成功地把复杂的sql语句解析为单句。下面谈谈成功的经验。
一. 全面整体思考,把握整个过程。
“全面整体思考,深入细致分析,反复权衡利弊,最佳方案决策”,这是解决任何问题的总原则,具有极高的智慧,是一个普遍的规律,适用于任何事物,在工作中要充分运用这个原则。
分布式Sql处理包含一系列操作,从解析到查询结果要对整个流程进行考虑,不要急于编写代码。只有把整个过程弄清楚了,才能做好设计和开发,架构设计是万里长征的第一步。在搞清整个过程的基础上,再深入细致地研究各个细节,从而拿出设计方案。
正是在通过这个办法,我研究了整个sql处理过程,从而设计了科学的方案,包括数据架构和算法,成功地解析了复杂的sql。
二.明确目标,掌握原理,找到规律,化繁为简。
编程之前要想好,任务和目标是什么?要完成什么功能?达到什么效果?有更好的办法吗?然后根据这个目标来研究,把其中的原理搞清楚,全面细致地分析问题,找到规律,把复杂的问题逐步简化,用简单的办法加以解决。
Sql语句十分复杂,包含几十个甚至上百个子语句,有数十甚至上百个selcet、from、where 、union等关键字,怎么解析成一个个单句,就需要按照以上办法动脑筋思考。
通过分析,我找到了其中的规律,主sql和子sql的处理方法是一样的,他们有相同的格式,对每一个sql来说,selcet、from、where是基本的单元,是同时成对出现的,有where必定有selcet、from。明确了这个规律以后,我设计了递归算法,成功地解析了sql。
在对sql的分析中,我用简单的办法,化繁为简,如庖丁解牛一般把sql的各个关键字的位置找出来。我采用的办法是加减法,再就是从左到右和从右到左分析的办法。通过分析发现,where关键字比较特殊,找到where以后可以方便地找到from、union等关键字,从而找到一条sql语句。如何找where呢?关键在于排除前面子sql中的where,办法是从左到右找where,然后从右到左找这个where左边的from和selcet,加以删除,做个减法,直到selcet的位置为0,也即找到了这一句的开始的selcet,那么这个where就是这个sql的where。对于其他的关键字,则在where的位置的基础上如法炮制,巧妙地找出其位置。
算法+数据结构=程序,通过分析,设计合适的算法和数据结构,才能正确地编写代码,最好一次成功,尽量少调试。
三.妙用递归,化繁为简。
递归(recursion)就是函数在运行的过程中调用自己。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回,必须有一个明确的递归结束条件,称为递归出口。
递归是一种非常巧妙的思路,用同样的办法处理问题的各个部分,只要把处理过程写出来,其余的交给计算机完成,代码简洁,方法简单,极大地提高效率,运用巧妙,可以达到出奇制胜的效果。使用递归要掌握一个规律,那就是把问题分解为一和多,一和多处理的方法是相同的,这就是递归最关键的技术所在,再就是要考虑好结束条件。我就是用递归的算法简单地解决了Sql语句的解析的难题。Sql语句的特点在于用相同的格式,主sql和子sql的解析过程是一样的,因此,特别适用用递归算法处理。
我设计了一个递归方法sqlPrase,把sql解析成一条条单句,办法是这样的:找到where、from、union等关键字在sql中的位置,然后找到select、where、from、union的各个子句,用递归的方法处理这些子sql,再就是处理本sql,按要求把sql解析为一条条可以执行的单句。在这里要注意的是,递归的算法是整体考虑,即只需要考虑一种情况的处理,其余的部分用同样的方法处理。对于一条复杂的sql语句,前面处理子sql,后面解析sql时,是把他作为已经处理完子sql的单句加以解析,这就是递归的特点。
四.沟通合作,团队力量。
开发任务是一个团队,大家分工合作,一定要做好沟通交流,任务的各个流程全面整体思考,大家都对整个系统十分了解,从而才能正确地做好所负责的工作,发挥出团队的力量。
我解析后的sql要交给别的同事查询,因此我一开始就和同事商量讨论,确定了数据结构,这样开发出的sql对方才能了解。一定要做好沟通,工作才不会走弯路。
总之,要善于化繁为简,定目标、明原理、找规律、任何复杂的问题都可以分解成多个简单的部分完成,每个部分的处理都是简单的,苹果公司的乔帮主就特别推崇简单之禅,我们在工作中要充分运用这一思想,做到大道至简,出奇制胜。