OBCP第三章 SQL引擎高级技术-SQL请求执行流程

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: OBCP第三章 SQL引擎高级技术-SQL请求执行流程

SQL请求执行流程-词法/语法解析

Parser(语法/语法解析模块)


在收到用户发送的SQL请求串后,Parser会将字符串分成一个个的“单词”,并根据预先设定好的语法规则解析整个请求,将SQL请求字符串转换成带有语法结构信息的内存数据结构,我们称为“语法树”(Syntax Tree)


为了加速SQL请求的处理速度,OceanBase对SQL请求采用了特有的“快速参数化”,以加速查找plan cache的速度。

SQL请求执行流程-语义解析

Resolver(语义解析模块):


当SQL请求字符串经过语法、词法解析,生成“语法树”之后, resolver会进一步将该语法树转换为带有数据库语义信息的内部数据结构


在这一过程中,resolver将根据数据库元信息将SQL请求中的token翻译成对应的对象(例如库、表、列、索引等),生成的数据结构叫做Statement Tree(语句树)


SQL请求执行流程-逻辑改写

Transformer(逻辑改写模块):


在查询优化中,经常利用等价改写的方式, 将用户SQL转换为与之等价的另一条SQL,以便于优化器为之生成最佳的执行计划,我们称这一过程为“查询改写”


Transformer 在 resolver 之 后 ,分析用户SQL的语义,并根据内部的规则或代价模型,将用户SQL“改写”为与之等价的其他形式,并将其提供给后续的优化器做进一步的优化

SQL请求执行流程-优化器

Optimizer(优化器):


优化器是整个SQL请求优化的核心,其作用是为SQL请求生成最佳的执行计划在优化过程中,优化器需要综合考虑SQL请求的语义、对象数据特征、对象物理分布等多方面因素,解决访问路径选择、连接顺序选择、连接算法选择、分布式计划生成等多个核心问题,最终选择一个对应该SQL的最佳执行计划


为了充分利用OceanBase的分布式架构和多核计算资源的优势, OceanBase的查询优化器会对执行计划做并行优化:根据计划树上各个节点的数据分布,对串行执行计划进行自底向上的分析,把串行的逻辑执行计划改造成一个可以并行执行的逻辑计划。

SQL请求执行流程-代码生成器

Code Generator(代码生成器):


优化器负责生成最佳的执行计划,但其输出的结果并不能立即执行,还需要通过代码生成器将其转换为可执行的代码,这个过程由Code Generator负责


Code Generator执行的过程只是忠实地将优化器的生成结果翻译成可执行代码,并不做任何优化选择

SQL请求执行流程-执行器

Executor(执行器):


对于本地执行作业,Executor会简单的从执行计划的顶端的算子开始调用,由算子自身的逻辑完成整个执行的过程,并返回执行结果


对于远程或分布式作业,Executor需要根据预选的划分,将执行树分成多个可以调度的job,并通过RPC将其发送给相关的节点执行


执行计划快速参数化

将SQL进行参数化(即将SQL中的常量转换为参数),然后使用参数化的SQL文本作为键值在Plan Cache中获取执 行计划,从而达到仅参数不同的SQL能够共用相同的计划目的。


参数化过程是指把SQL查询中的常量变成变量的过程。


传统数据库在进行参数化时一般是对语法树进行参数化,然后使用参数化后的语法树作为键值在Plan Cache中获取计划,而OB是使用的词法分析对文本串直接参数化后作为Plan Cache的键值。

执行计划快速参数化-参数化过程举例

请求的SQL(无不能参数化的常量)

select * from t1 
where c1 = 5 and c2 = 'oceanbase';

经过词法分析后得到的参数化SQL

select * from t1 
where c1 = @1 and c2 = @2;

参数数组

{5,'oceanbase'}

请求的SQL(存在不能参数化的常量)

select * from t1 
where c1 = 5 and c2 = 'oceanbase'
order by 1;

经过词法分析后得到的参数化SQL

select * from t1 
where c1 = @1 and c2 = @2
order by @3;

参数数组

{5,'oceanbase',1}

约束条件

快速参数化参数数组的第3项必须为数字1

执行计划快速参数化-常量不能参数化的场景

1.所有 ORDER BY 后常量(例如"ORDER BY 1,2;")

2.所有 GROUP BY 后常量(例如"GROUP BY 1,2;")

3.LIMIT 后常量(例如"LIMIT 5;")

4.被物化的参数精度数字(例如"NUMBER(10,2);")

5.select投影列中常量(例如"select 1 as id from tab;")

6.作为格式串的字符串常量(例如"DATE_FORMAT('2006-06-00', '%d'); "里面的"%d")

7.函数输入参数中,影响函数结果或带有隐含信息并最终影响执行计划的常量(例如"CAST(999.88 as NUMBER(2,1))"中的"NUMBER(2,1)",或者"SUBSTR('abcd', 1, 2)"中的"1, 2",或者"SELECT UNIX_TIMESTAMP('2015-11-13 10:20:19.012');" 里面的"2015-11-13 10:20:19.012",指定输入时间戳同时,隐含指定了函数处理的精度值为毫秒)

执行计划快速参数化-常量不能参数化举例

表t1中含c1, c2列,其中c1为主键列,两条SQL只有order by常量不同

select c1, c2 from t1 order by 1;


c1为主键,当使用主键访问可以免去排序,当需要对 c2 排序,则需要执行显示的排序操作。因此,不能将order by 后面的常量参数化,否则会导致不同order by的值参数化后具有相同的参数化后的SQL,从而命中错误的计划

通过OBProxy的SQL请求执行流程

OBProxy 包含简单SQL Parser 功能,可进行轻量SQL解析,即先从客户端发出的SQL语句解析出数据库名和表名,再根据用户的租户名、数据库名、表名以及分区ID信息等信息,向OBServer拉取表分区的路由表

查看各阶段耗时







相关文章
|
1月前
|
SQL 存储 算法
比 SQL 快出数量级的大数据计算技术
SQL 是大数据计算中最常用的工具,但在实际应用中,SQL 经常跑得很慢,浪费大量硬件资源。例如,某银行的反洗钱计算在 11 节点的 Vertica 集群上跑了 1.5 小时,而用 SPL 重写后,单机只需 26 秒。类似地,电商漏斗运算和时空碰撞任务在使用 SPL 后,性能也大幅提升。这是因为 SQL 无法写出低复杂度的算法,而 SPL 提供了更强大的数据类型和基础运算,能够实现高效计算。
|
2月前
|
SQL 安全 数据库
sql注入技术
sql注入技术
|
3月前
|
SQL 缓存 关系型数据库
揭秘MySQL一条SQL语句的执行流程
以上步骤共同构成了MySQL处理SQL语句的完整流程,理解这一流程有助于更有效地使用MySQL数据库,优化查询性能,及时解决可能出现的性能瓶颈问题。
107 7
|
3月前
|
SQL 机器学习/深度学习 自然语言处理
Text-to-SQL技术演进 - 阿里云OpenSearch-SQL在BIRD榜单夺冠方法剖析
本文主要介绍了阿里云OpenSearch在Text-to-SQL任务中的最新进展和技术细节。
|
3月前
|
SQL 安全 数据库
基于SQL Server事务日志的数据库恢复技术及实战代码详解
基于事务日志的数据库恢复技术是SQL Server中一个非常强大的功能,它能够帮助数据库管理员在数据丢失或损坏的情况下,有效地恢复数据。通过定期备份数据库和事务日志,并在需要时按照正确的步骤恢复,可以最大限度地减少数据丢失的风险。需要注意的是,恢复数据是一个需要谨慎操作的过程,建议在执行恢复操作之前,详细了解相关的操作步骤和注意事项,以确保数据的安全和完整。
165 0
|
4月前
|
SQL JSON Go
Go - 基于 GORM 获取当前请求所执行的 SQL 信息
Go - 基于 GORM 获取当前请求所执行的 SQL 信息
72 3
|
4月前
|
Java 测试技术 容器
从零到英雄:Struts 2 最佳实践——你的Web应用开发超级变身指南!
【8月更文挑战第31天】《Struts 2 最佳实践:从设计到部署的全流程指南》深入介绍如何利用 Struts 2 框架从项目设计到部署的全流程。从初始化配置到采用 MVC 设计模式,再到性能优化与测试,本书详细讲解了如何构建高效、稳定的 Web 应用。通过最佳实践和代码示例,帮助读者掌握 Struts 2 的核心功能,并确保应用的安全性和可维护性。无论是在项目初期还是后期运维,本书都是不可或缺的参考指南。
54 0
|
4月前
|
测试技术 Java
揭秘Struts 2测试的秘密:如何打造无懈可击的Web应用?
【8月更文挑战第31天】在软件开发中,确保代码质量的关键在于全面测试。对于基于Struts 2框架的应用,结合单元测试与集成测试是一种有效的策略。单元测试聚焦于独立组件的功能验证,如Action类的执行逻辑;而集成测试则关注组件间的交互,确保框架各部分协同工作。使用JUnit进行单元测试,可通过简单示例验证Action类的返回值;利用Struts 2 Testing插件进行集成测试,则可模拟HTTP请求,确保Action方法正确处理请求并返回预期结果。这种结合测试的方法不仅提高了代码质量和可靠性,还保证了系统各部分按需协作。
29 0
|
4月前
|
SQL 数据挖掘 数据库
SQL中的重复行删除:技术与策略
【8月更文挑战第31天】
136 0
|
4月前
|
SQL 数据管理 关系型数据库
SQL分区表技术的奥秘:如何用分区策略让你的大规模数据飞起来?
【8月更文挑战第31天】在现代软件开发中,处理大规模数据是常见挑战,而SQL分区表技术提供了一种高效的解决方案。本文详细介绍了SQL分区表的概念、类型(范围、列表、哈希和键分区)及其创建与维护方法,并通过示例代码展示了如何添加、删除和重组分区。遵循了解查询模式、定期维护分区及使用数据库性能工具等最佳实践,可以帮助开发者更高效地进行数据管理。随着SQL生态的发展,分区表技术将在未来发挥更大作用。
49 0
下一篇
DataWorks