`
whilew
  • 浏览: 22203 次
文章分类
社区版块
存档分类
最新评论

SQL语句解析过程浅析

 
阅读更多
在一些系统中需要对SQL查询语句进行解析,并最终根据业务需求将其转换处理将其转换为真实的SQL语句,这一过程我把它简称为:逻辑SQL-物理SQL的转换。在这一过程其中的关键技术是逻辑SQL语法分析,语法分析实现采用例如树型语法分析模型等方式实现,它是以二叉树方式,针对SQL中的关键字(例如:Select,From,Where等)进行判断并作为节点形成树型基本结构,再以二叉树方式加载查询数据(例如:查询字段,表名,条件等),最后形成二叉树结构模型,为后续的逻辑模型转换为物理模型提供词元数据,最后借助元数据系统辅助实现SQL语句转换工作。
逻辑SQL语句的解析(LSQL Parse)在技术上主要依托Antlr产品来实现。而ANTLR是语言识别的一种工具。它可以接受语法规则描述,并能根据语法规则自动产生识别这些符合语法规则的语句的程序。它作为翻译程序的一部分,可以允许使用简单的操作符和动作来表达你的语法规则,从而帮助ANTLR轻松简单地创建抽象语法树(AST)和产生最终输出信息。ANTLR能够知道怎样去生成识别程序,语言包括Java,C++,C#和Python等。

逻辑SQL脚本自动解析功能借助Antlr来实现对逻辑SQL脚本的词法、语法和语义分析,然后将逻辑SQL语句根据规则自动分拆为不同词元,并生成AST(抽象语法树)对象结构进行存储,后续的逻辑SQL检查与转换工作将主要围绕解析后生成的AST对象展开。具体的逻辑SQL完整解析过程如下图所示:


图:LSQL语句解析全过程示意图

为了能够不断地对后续逻辑SQL解析功能的完善和应用扩展,在系统实现过程中将逻辑SQL解析模块封装形成了独立组件,整体上保持形成一个较为松耦合的架构。其中逻辑SQL解析组件主要负责进行逻辑SQL语句按照设定的词法规则分拆成为特定的词元(Token),并在词元分拆的基础上进行相应的语法分析(主要依据设定的语法规则进行),最后将符合词法与语法要求的LSQL转换成为由若干词元形成的AST对象,并在AST对象的基础上配合元数据管理系统进行语义检查工作(主要是进行表实体,表属性,及实体与实体关系,实体属性关系等检查),最后完成由逻辑SQL语句到SQL语句的转换工作,具体工作过程如下图所示:


图:LSQL解析器工作过程示意图

下面通过一个具体的LSQL示例,来具体分析一下基于Antlr进行词法分析、语法分析后生成的AST对象结构,加强一下对解析过程的直接了解,示例LSQL语句如下所示:

SELECT [个人用户基本属性.用户编码],[个人用户基本属性.居住地址] FROM [个人用户基本属性] WHERE [个人用户基本属性.居住地址] IN ( SELECT [k.ADDR] FROM (SELECTCOUNT([个人用户基本属性.用户编码]) AS[C_USERID], [个人用户基本属性.居住地址] AS[ADDR] FROM [个人用户基本属性] GROUP BY [个人用户基本属性.居住地址]) as [K] WHERE [K.C_USERID]<5)

经过LSQL解析器后,生成的AST对象结构如下图所示:


从上图中可以看出,在AST中将结合在语法规则中设定的不同SQL句型的标识,形成完整的树形结构,后续的工作将紧紧围绕着树形对象的遍历展开.

整个LSQL解析组件基于编译技术,实现LSQL脚本的语法结构化描述,为后续的语义结构化描述建立抽象语法树(AST)。其处理过程可分为词法分析和语法分析两个步骤。在词法分析阶段,解析程序根据预先定义的SQL词法文法,对SQL脚本的字符流进行分词处理,输出SQL关键字、常量、变量、操作符等分词序列(TOKEN)。在语法分析阶段,解析程序根据预先定义的LSQL语法文法,对分词序列进行语法分析,建立层次化的抽象语法树。下图显示对一条SELECT语句解析处理后输出的AST。其中LSQL的语法规则文件如下所示:


图:LSQL语法规则文件示例

结合本次使用Antlr进行了LSQL解析工作进行的各项工作,对LSQL解析的主要优点与不足之处总结如下所示:

一、主要优点

a)基于解析之后的语法树提供用户操作接口,灵活性非常好,因为达到了对SQL每一部分的完整控制;

b)在数据库的适应性上只要符合标准SQL,以及部分封装好的特性(例如分页)、函数(例如主要数据库都支持的函数,但语法有一定差异的),基本上能够得到良好地支持;

c)具备编译期检查能力,能够提前检查LSQL的正确性,减少了系统不必要的开销;

d)能够完全把握住了整个解析过程,可以对解析过程进行深度加工处理;

二、不足之处

a)对LSQL的语法规则有较强的要求,目前测试所用的LSQL语句从语法结构上面来讲过于随意,没有一个标准的语法规则进行约束,这样给解析工作带来了较大的难度;

b)AST语法树看起来以及实现上不大流畅,表达式类体系结构清晰度不够,处理过程存在一定的复杂性,对性能有一定的影响;

对多种数据库的支持的Dialect的机制实现较为复杂,需要进行大量的二次开发工作,才能基本满足要求。



分享到:
评论

相关推荐

    SQL语句的性能优化浅析.pdf

    在实际的SQL语句优化过程中,除了考虑操作符的影响,还需要考虑查询顺序、条件字段等多个方面。SQL语句的性能优化是一个复杂的工程,需要数据库管理人员根据系统的具体情况,制定合适的优化策略。通过减少页面存取,...

    浅析SQL查询语句的优化策略.pdf

    SQL语句优化的基本规则包括但不限于:统一SQL语句书写格式,尽量精简SQL语句以及尽量避免全表扫描。一个统一的书写格式可以避免优化器产生多个执行计划,从而节约优化器的分析时间;精简的SQL语句可以提高语句的可...

    浅析SQL Server中的执行计划缓存(上)

    当SQL语句通过查询分析器时,会经过解析、绑定、优化和执行四个阶段,生成执行计划。由于生成执行计划的过程涉及复杂的计算和资源消耗,特别是查询优化器的工作,包括解析表名、生成逻辑操作树、优化和简化查询、...

    浅析SQL语句行列转换的两种方法 case…when与pivot函数的应用

    在SQL中,对数据进行行列转换是数据分析过程中常见的需求,特别是在报表展示或数据汇总时。本文将详细探讨两种实现这一转换的方法:`CASE...WHEN` 和 `PIVOT` 函数,通过具体的示例来解析它们的用法。 1. `CASE......

    浅析白盒审计中的字符编码及SQL注射1

    例如,输入`%df'`,在GBK编码中,`%df`会被解析为一个非ASCII的汉字,然后紧接着的单引号`'`将不再被转义,导致SQL语句的语法错误,从而触发了注入。攻击者可以利用这种错误来构造更复杂的SQL语句,绕过过滤机制,...

    浅析Oracle数据库中Pro*C程序.pdf

    - 提高效率:由于SQL语句在预编译阶段被转换为C代码,执行时减少了解析和编译的时间。 - 易于调试:由于程序逻辑主要在C语言中实现,调试过程与其他C程序相似。 - 强大的数据库操作能力:结合SQL和PL/SQL,可以处理...

    SQLite编译器部分浅析附件.zip

    SQLite的编译器是SQLite引擎的核心组件之一,它的主要任务是解析SQL语句,将其转化为内部表示(通常称为抽象语法树,AST),然后优化这个树结构,并生成可执行的虚拟机指令。这一过程包括词法分析、语法分析、语义...

    浅析Oracle数据库的优化.pdf

    解析过程是SQL语句在Oracle中执行的第一步,包括计算语句值、检查共享池中是否存在相同语句、创建空间并存储语句等步骤。理想的优化是减少额外的处理步骤,例如,避免Oracle每次都重新准备和存储相同的SQL语句。...

    浅析SQL Server中包含事务的存储过程

    当在存储过程中添加事务时,我们可以确保在该过程中执行的所有SQL语句要么全部成功,要么全部不成功,这符合ACID(原子性、一致性、隔离性和持久性)原则。 例如,在上面给出的存储过程示例中,我们看到了如何使用...

    浅析SQL Server参数化查询

    因为参数化查询使得SQL语句的结构与数据分离,数据库解析器能够预编译和缓存查询计划,从而减少解析和编译时间,提高执行效率。即使在公司内部系统中,不考虑SQL注入风险,也应该使用参数化查询以优化性能。 错误...

    浅析SQL Server数据库操作XML的基本方法.pdf

    OPENXML可以解析XML文档,并提供一种方式通过SQL语句来查询和操作XML文档中的数据。 为了使用上述功能,某些技术可能需要SQL Server 2000的WEB Release 1软件包,该软件包可以从Microsoft官方网站免费下载。此外,...

    Oracle与sql简单优化与锁机制浅析.ppt

    Shared Pool存放缓存的SQL语句、执行计划和数据字典,优化SQL执行效率。Java Pool存储Java对象,Large Pool处理大块内存需求,如并行执行和备份。Redo Log Buffer则缓存重做日志,确保事务的持久性。 事务处理是...

    腾讯大讲堂数据库内核设计思路浅析学习教案.pptx

    - 任务队列是协调工作线程分配任务的核心机制,工作线程从队列中获取任务并执行,如SQL语句的解析和执行。 2. **线程类型**: - 控制台线程:处理用户在控制台输入的命令,提供与数据库交互的界面。 - 工作线程...

    腾讯大讲堂数据库内核设计思路浅析PPT学习教案.pptx

    4. **语法/词法分析**:通过工具如YACC/LEX对SQL语句进行解析,过滤注释,解析参数,生成统一的语法树结构,方便后续处理。 例如,SQL中的FROM子句解析,如`SELECT * FROM t1, t2, t3;`,在词法和语法分析阶段会被...

    MySQL与SQL Server的一些区别浅析

    - MySQL创建非聚集索引较简单,只需在建表时指定`KEY`,SQL Server则需使用`CREATE INDEX`语句。 14. 字段长度限制: - MySQL表单个字段总长度不超过65535个字符。 15. 安装和资源占用: - MySQL安装简单,文件...

    浅析SQLServer中的Scanf与Printf

    在示例中,`xp_sprintf`创建了一个SQL查询语句,该语句根据传递的参数选择`sysobjects`表中的特定列,并根据`name`列的值筛选记录。`xp_sprintf`接受一个输出变量`@s`以及一系列要格式化的参数,例如列名、表名、...

    深入浅析SQL中的group by 和 having 用法

    例如,在人力资源数据库中,查询每个部门的员工人数,可以编写如下SQL语句: ```sql SELECT DepartmentID AS '部门名称', COUNT(*) AS '个数' FROM BasicDepartment GROUP BY DepartmentID ``` 在这个例子中,`...

    MySQL服务器连接过程浅析

    `THD`在整个SQL语句的生命周期中起着核心作用,从连接建立到查询执行,再到结果返回,`THD`都参与其中,存储了大量的上下文信息。同时,还有一个`struct st_vio`结构体,它作为数据传输的中介,负责从网络套接字读取...

Global site tag (gtag.js) - Google Analytics