当前位置: 首页 > news >正文

GaussDB 数据库架构师修炼(十八) SQL引擎-解析器

什么是SQL解析

SQL解析是SQL查询处理中的第一个模块。对输入的原始SQL语句,SQL解析将SQL查询语句转换为等效的关系代数运算,它通常以基于关系代数的查询树来表示。查询树会作为后续查询优化模块的输入。
SQL解析又可划分为三个子模块,包括词法分析、语法分析和语义分析,三个模 块按照顺序执行:
词法分析提取出SQL语句中的关键词、常量等成分
语法分析:将词法分析提取的成分构建为一棵语法分析树
语义分析:检查语法分析树的语义正确性, 并将其转化为基于关系代数式表达的查询树

2 词法分析

SQL解析的第一步是对SQL查询进行词法分析。

词法分析模块会按照查询语句的词法规则(通常使用正则表达式定义 将查询语句拆解为token 序列,并提取关键词、标识、常量等,并对不同类别的单词进行类别标记

3 语法分析

1)根据词法分析输出的原子节点构建语法分析树

2)首先根据语法规则判断SQL语句是否符合语法限制。如果符合语法规则,则按照语法规则识别出SQL查询中的语法类节点, 并结合词法分析输出的原子节点(关键词等)构建一棵语法分析树

在SQL解析中,关键字(也称为关键词)是一种特殊定义的字符串。关键字分为 保留关键字非保留关键字

  • 1)保留关键字是在SQL中具有特殊含义的单词 ,通常用于表示SQL查询语句的不同部分,如操作类型或条件。例如SELECT 、CREATE 、ALL 、GROUP  BY 、IS 、NOT 、WHERE等。特别要注意的是保留关键字不可被用作列名、表名其他标识, 但添加双引号后可支持,例如"SELECT"。

2)非保留关键字只是在特定的环境里有特殊的含义, 而在其他环境里是可以用作标识符的。例如 ABORT 、ADD 、AT 、BLOB 、COLVIEW 、COPY等。这些关键字不支持直接作为列别名使用,  但可以作为列名和表名。 GaussDB还存在一些特别的非保留关键字在一些情况下有特殊限制。

3)移进规约

对于自下而上的上下文无关语法分析器中, 栈保留正在处理的字符。 移进指将输入字符压入栈顶, 规约指根据文法规则将栈顶的若干字符替换为一个非终结符(匹配到某个语法规则)。

  • 移进-规约冲突:在某一时刻,可以移进,也可以规约。GaussDB会选择移进,继续向下匹配。  

    规约-规约冲突:所处理的字符串可以匹配到多个规则,分析器无法判断到底该选择哪项规则。这种就需 要指定优先级等策略辅助确定规则。

  • 4 语义分析

  • 语义分析要对语法分析所输出的语法分析树进行语义上的正确性检查 并将语法分析树转化为方 便查询优化阶段处理的查询树

  • 正确性检查包括:

      关系进行检查:查询中出现的关系是否存在于关系模式

      属性的检查:查询中涉及的属性是否能在数据库关系中找到匹配项

      数据类型的检查:查询中的运算是否与涉及的属性类型相匹配

    正确性检查完毕后,则将语法树逻辑等价转化为基于关系代数式表达的查询树以便后面的查询优化。   

(Π)表示投影; (X)表示笛卡尔积; (σ)表示选择; (^)表示逻辑与

          转化后的关系代数查询树

http://www.dtcms.com/a/346713.html

相关文章:

  • 慢查询该怎么优化
  • 【文献阅读】Lossless data compression by large models
  • 【卷积神经网络详解与实例】2——卷积计算详解
  • Hive中的join优化
  • 解决散点图绘制算法单一导致的数据异常问题
  • DeepSpeed v0.17.5发布:优化性能与扩展功能的全新升级
  • Axure:有个特别实用的功能
  • 寻找AI——高保真还原设计图生成App页面
  • 【K8s】整体认识K8s之Docker篇
  • 完整实验命令解析:从集群搭建到负载均衡配置
  • 在TencentOS3上部署OpenTenBase:从入门到实战的完整指南
  • week4-[循环结构]生日悖论-new
  • 【C语言16天强化训练】从基础入门到进阶:Day 8
  • 【基础-判断】Video组件可以支持本地视频路径和网络路径播放。播放网络视频时,需要申请权限ohos.permission.INTERNET
  • Clustering Enabled Wireless Channel Modeling Using Big Data Algorithms
  • 学习游戏制作记录(合并更多的技能与技能树)8.23
  • 祝贺,国产轻量级桌面GIS软件Snaplayers下载量突破上万
  • 【技术突破】动态目标误检率↓83.5%!陌讯多模态融合算法在智慧城管的实战优化
  • 算法训练营day60 图论⑩ Bellman_ford 队列优化算法、判断负权回路、单源有限最短路
  • Kubernetes笔记整合-1
  • 定时器互补PWM输出和死区
  • 【手撕JAVA多线程:2.线程安全】 2.1.JVM层面的线程安全保证
  • 硬件-时钟学习DAY5——石英晶体负载电容设计全解析
  • Adobe Acrobat 创建和分发交互式 PDF 表单
  • lanczso算法中的额外正交化代码解释
  • Java性能优化实战(六):缓存策略的3大核心优化方向
  • 新手向:异步编程入门asyncio最佳实践
  • PyTorch生成式人工智能——VQ-VAE详解与实现
  • chapter06_应用上下文与门面模式
  • pcie实现虚拟串口