首页/新闻资讯/正文详情

SOAR 体系架构深度解析:语法解析、集成环境、优化建议与重写逻辑

发布时间:2026/9/25 11:05:09 来源:云帆数科 栏目:资讯中心
SOAR 体系架构深度解析:语法解析、集成环境、优化建议与重写逻辑
开发工具数据库【免费下载链接】soarSQL Optimizer And Rewriter项目地址https://gitcode.com/gh_mirrors/so/soar点击查看免费下载SOARSQL Optimizer And Rewriter是一款由小米数据库团队开发维护的 SQL 优化与改写自动化工具其整体架构由语法解析器、集成环境、优化建议、重写逻辑、工具集五大模块组成。本文以官方架构文档 doc/structure.md 为主线结合仓库源码逐一拆解每个模块的设计思路与底层实现读者可以借此掌握 SOAR 从 SQL 输入到优化建议产出的完整调用链路以及如何为二次开发或深度使用定位到对应代码位置。五大模块总览SOAR 的架构图如下整个系统呈现一条清晰的流水线SQL 先经过语法解析与检查再在集成环境中完成环境准备随后由优化建议模块产出评审结论必要时由重写逻辑产出等价改写后的 SQL最后由工具集负责输出格式化与展示。围绕这条流水线doc/structure.md 将 SOAR 拆解为五大模块模块核心职责对应源码目录语法解析器将 SQL 解析为抽象语法树并做语法检查ast/、advisor/rules.go 中 ERR 规则集成环境区分线上/测试环境提供安全执行与元数据支撑database/、common/config.go优化建议启发式规则、索引优化、EXPLAIN 解读三类建议advisor/heuristic.go、advisor/index.go、advisor/explainer.go重写逻辑数十种常见场景下的 SQL 等价转写ast/rewrite.go工具集markdown 转 HTML、SQL 格式化等辅助能力common/markdown.go、common/tricks.go语法解析和语法检查三套解析器的可插拔组合一条 SQL 从文件、标准输入或命令行参数等形式传递给 SOAR 后首先进入语法解析器。在解析器的选型上SOAR 采用了松散、可插拔的集成方案而不是自行维护一套庞大的语法解析库其演进过程分为三步Vitess 语法解析库首选项目最初选用 Vitess 的sqlparser作为主解析库。从源码可见SOAR 在构造评审对象Query4Audit时先用sqlparser.Parse(sql)生成 Vitess 抽象语法树但vitess 语法解析不上报以 tidb parser 为主见 advisor/rules.goTiDB 语法解析器补充随着需求增加部分复杂 SQL 用 Vitess 实现较为吃力因此引入 TiDBpingcap/parser的语法解析器作为补充。ast.TiParse()会先通过removeIncompatibleWords()预处理 pingcap/parser 不支持的语法例如剔除ON UPDATE CASCADE、把CREATE TEMPORARY TABLE改写为CREATE TABLE等见 ast/tidb.goMySQL 执行返回结果方言盲区兜底两套解析器仍存在盲区因此 SOAR 又引入 MySQL 真实执行返回结果作为多版本 SQL 方言的补充例如对 Vitess 语法错误ERR.000、执行错误ERR.001与 EXPLAIN 错误ERR.002的识别都依赖这一路输入。在 advisor/rules.go 的规则代号注释中ERR被明确标注为特指 MySQL 执行返回的报错信息这印证了三路解析输入在错误处理层面的分工。集成环境线上环境与测试环境的双环境设计集成环境区分线上环境与测试环境用于解决不同场景下的 SQL 优化需求已有表结构的优化场景从线上环境导出表结构和足够采样数据到测试环境即可在测试环境放心执行各种高危操作而不用担心数据损坏全新数据库的验证场景只需验证数据字典中是否存在优化可能用户甚至不需要知道线上环境在哪试错成本极低。这两个环境在配置结构体Configuration中对应OnlineDSN与TestDSN两个数据源配置另有一系列开关控制行为见 common/config.go配置项含义online-dsn/test-dsn线上/测试环境的数据库连接addr、schema、user、password、disableallow-online-as-test允许 Online 环境同时当作 Test 环境使用disable-version-check禁用环境检测不建议开启可能导致语句执行异常drop-test-temporary是否清理 Test 环境产生的临时库表cleanup-test-database清理程序异常退出时残余的测试数据库sampling/sampling-condition数据采样开关与采样条件profiling/trace/explain测试环境执行的 Profiling、Trace 与 Explain 开关从 advisor/index.go 的NewAdvisor()可以看出索引建议正是同时依赖env.VirtualEnv测试环境与database.Connector线上环境两个句柄DDL 语句会先把库表元数据登记进测试环境遇到USE语句则切换测试环境当前库。关于双环境更完整的组合场景说明见 集成环境。优化建议三类建议的合并输出目前 SOAR 可提供三类优化建议基于启发式规则经验的建议、基于索引优化算法的建议、以及基于 EXPLAIN 信息的解读。启发式规则建议启发式规则的元数据结构由规则代号、危险等级、规则摘要、规则解释、SQL 示例、建议位置、规则函数七部分组成其定义如下见 advisor/rules.go// Rule 评审规则元数据结构 type Rule struct { Item string json:Item // 规则代号 Severity string json:Severity // 危险等级L[0-8], 数字越大表示级别越高 Summary string json:Summary // 规则摘要 Content string json:Content // 规则解释 Case string json:Case // SQL示例 Position int json:Position // 建议所处SQL字符位置默认0表示全局建议 Func func(*Query4Audit) Rule json:- // 函数名 }每一条 SQL 经过语法解析后会经过数百个启发式规则逐一检查命中的规则保存在heuristicSuggest变量中传递下去与其他优化建议合并输出。规则的代号具有明确的缩写语义例如ALIAliasALI.001建议显式使用 AS 关键字声明别名ALI.002不建议给通配符*设置别名L8 高危ALI.003提示别名不要与表或列同名ARGArgumentARG.001不建议使用前项通配符查找like %fooARG.002提示没有通配符的 LIKE 等价于等值查询ALTAlterALT.001提醒修改表默认字符集不会改已有字段字符集ALT.002建议同一张表多条 ALTER 合并ALT.003/ALT.004将删除列、删除主外键标记为高危操作COL、IDX、JOI、SEC、SUB等分别对应列、索引、连接、安全、子查询等维度完整清单见 advisor/rules.go。所有启发式规则实现的函数集中在 advisor/heuristic.go共 4160 行规则列表保存在 advisor/rules.go共 1610 行中。规则函数与规则代号在InitHeuristicRules()中通过 map 绑定例如RuleImplicitAlias对应ALI.001、RulePrefixLike对应ARG.001。运行时可以通过soar -list-heuristic-rules打印全部规则用soar -ignore-rules ALI.001,IDX.*忽略指定规则见 doc/cheatsheet.md。索引优化索引优化模块的挑战在于把 DBA 沉淀的经验转化为覆盖全面、逻辑可推导的算法。SOAR 参考了大量前人著作、论文与博客知识来源汇总在 鸣谢 章节核心算法依据《Relational Database Index Design and the Optimizers》一书提出的三星索引理论Three-Star Index第一颗星选取 WHERE 等值谓词列作为索引首列第二颗星加入 ORDER BY 列并保持原有顺序第三颗星将查询涉及的剩余列加入索引以形成覆盖索引见 advisor/index.go。在实现层面IndexAdvisor结构体见 advisor/index.go收集了whereEQ等值条件列、whereINEQ非等值条件列、groupBy、orderBy、joinCond跨层级 JOIN 条件等信息IndexInfo则输出一条完整索引建议包含索引名、库名、表名、DDL 语句与列详情。索引优化的详细算法描述见 索引优化。EXPLAIN 解读EXPLAIN 信息对新手而言记忆负担极重SOAR 仅在 EXPLAIN 信息注解一项就编写了约 200 行代码按平均行长 120 计算相当于为 DBA 节省了不下 2 万字的记忆量。解读逻辑集中在 advisor/explainer.go实现上采用按维度检查、按表聚合建议的方式checkExplainSelectType()按配置的ExplainWarnSelectType匹配SelectType并给出建议checkExplainAccessType()按配置的ExplainWarnAccessType匹配访问类型如全表扫描输出Scalability提示checkExplainRef()检查Ref列为 NULL 的访问路径对 JSON 格式的 EXPLAIN 结果会先通过database.ConvertExplainJSON2Row()转成行格式统一处理。所有 EXPLAIN 类建议以EXP.XXX作为规则代号。完整的解读逻辑见 EXPLAIN 信息解读。重写逻辑从给建议到帮改写早期 SOAR 的功能停留在建议层面初级用户看到建议也不一定会改写。为降低 SQL 优化成本SOAR 进一步实现了自动 SQL 重写提供几十种常见场景下的 SQL 等价转写。重写规则定义在 ast/rewrite.go 中每个规则包含名称、描述、错误示范Original、正确示范Suggest与改写函数且规则是有序的先后顺序不能乱。已内置的改写规则包括规则名作用dml2select/reg2select将 DELETE 等更新请求转换为只读 SELECT便于执行 EXPLAINstar2columns为SELECT *补全表的列信息insertcolumns为INSERT补全列信息having将 HAVING 中的查询条件改写进 WHEREorderbynull为不需要排序的 GROUP BY 添加ORDER BY NULLunionall用UNION ALL替代UNION提高查询效率or2in/or2union同列 OR 转 IN、不同列 OR 转 UNIONdmlorderby删除 DML 更新操作中无意义的 ORDER BYsub2join/join2sub子查询与 JOIN 的相互转换distinctstar删除对带主键表无意义的DISTINCT *standardSQL 标准化如关键字转小写规则之间的依赖顺序同样在代码中体现例如注释明确把所有跟 or 相关的重写完之后才进行 or 转 union 的重写。重写功能的完整逻辑见 重写逻辑运行时可结合 doc/cheatsheet.md 中-rewrite-rules配置项启用或关闭指定规则。工具集优化之外的辅助能力除了 SQL 优化和改写SOAR 还提供一系列辅助小工具方便用户使用并美化输出展现形式Markdown 转 HTML 工具将 markdown 报告转为带样式的 HTML支持report-type、report-css、report-javascript、report-title等配置项控制输出风格见 common/config.go 与 common/markdown.goSQL 格式化输出工具支持 SQL 压缩与美化相关实现见 ast/pretty.go 与 ast/rewrite.go 中的格式化逻辑其他实用命令-list-heuristic-rules打印全部启发式规则、-list-report-types打印支持的报告格式、-print-config打印配置等。所有小工具的具体用法都能在 常用命令 中找到例如最基本的用法echo select title from sakila.film | ./soar -log-outputsoar.log小结一条 SQL 在 SOAR 中的完整旅程回顾整个架构SOAR 的处理流水线可以概括为SQL 输入 → 三路语法解析Vitess TiDB MySQL 执行结果→ 集成环境准备线上/测试 DSN→ 三类优化建议合并输出启发式规则 索引算法 EXPLAIN 解读→ 等价重写 → 工具集美化输出。五大模块各司其职同时保持了松散、可插拔的设计风格——解析器不自己维护规则以 map 形式注册、以heuristicSuggest传递合并重写规则有序联动。对于想深入定制规则的开发者advisor/heuristic.go 与 ast/rewrite.go 是最佳切入点而对于想快速上手的使用者常用命令 与 配置文件 文档则提供了完整的操作指引。赞分享开发工具数据库【免费下载链接】soarSQL Optimizer And Rewriter项目地址https://gitcode.com/gh_mirrors/so/soar点击查看免费下载相关推荐Mesop 构建体系深度解析Bazel 双环境工具链与 Angular/Proto 集成实践Mesop 构建体系深度解析Bazel 双环境工具链与 Angular/Proto 集成实践 Mesop 是一个用 Python 快速构建 AI 应用的开源框前端后端Web框架重构TypeScript条件逻辑TS-Pattern类型系统深度解析重构TypeScript条件逻辑TS Pattern类型系统深度解析 你是否还在为TypeScript中复杂的条件判断代码感到困扰是否在面对多层嵌套的 if开发工具TorchTitan CI Docker 镜像构建体系解析从 build.sh 调度到 conda 环境与 DeepEP 集成TorchTitan CI Docker 镜像构建体系解析从 build.sh 调度到 conda 环境与 DeepEP 集成 TorchTitan 的 CI人工智能大模型预训练分布式训练强化学习上一篇从命令行到一键搞定Deepin Boot Maker如何让Linux启动盘制作变得如此简单下一篇Deepin Boot Maker免费开源启动盘制作工具的终极完整指南2025最新版创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

AD8552ARUZ零漂移运放:高精度传感器调理电路设计与实战
AD8552ARUZ零漂移运放:高精度传感器调理电路设计与实战

1. 从一颗芯片说起:为什么AD8552ARUZ值得单独聊搞模拟电路的人都有一个共识:运放选型这件事,选对了是事半功倍,选错了就是给自己挖坑。我这些年经手的项目里,从传感器信号调理到便携医疗设备,再到工业现场的… · 2026/9/25 11:04:57

I2C总线调试全攻略:从万用表到示波器,彻底解决ACK丢失问题
I2C总线调试全攻略:从万用表到示波器,彻底解决ACK丢失问题

1. 从一根“不听话”的I2C总线说起调试嵌入式系统时,最让人头疼的场景之一,莫过于代码逻辑看起来天衣无缝,但传感器就是没反应。你翻遍数据手册,时序参数算了又算,上拉电阻也按推荐值焊了,可SDA和SCL两条线… · 2026/9/25 11:04:51

AI苹果育苗智能分选移栽机器人 QT信创完整工程
AI苹果育苗智能分选移栽机器人 QT信创完整工程

# AI苹果育苗智能分选移栽机器人 QT信创完整工程 适配统信UOS、银河麒麟Qt5.12/5.15,针对苹果工厂化育苗开发;AI视觉识别**实生砧/八棱海棠/M9T337矮化砧、嫁接愈合度、苗木分级、花叶病/锈果病、缺苗弱苗**;依据国标苹果苗木壮苗标准自动分级筛选,机械臂柔性抓取移栽,土壤… · 2026/9/25 11:04:51

一篇论文能“真”到什么程度?云智变AI功能验证清单一份“看起来很对”的论文,到底缺了什么
一篇论文能“真”到什么程度?云智变AI功能验证清单一份“看起来很对”的论文,到底缺了什么

先抛一个问题。 把一篇AI生成的论文和一篇人类学者写的论文放在一起,让有经验的审稿人来判断,通常不出三段就能分辨。不是因为语言水平——现在的大模型写出来的学术句式,流畅度早就超过大部分研究生。区分它们的是另一个东西: … · 2026/9/25 11:38:31

命令注入漏洞原理、绕过手法与多层防御实战指南
命令注入漏洞原理、绕过手法与多层防御实战指南

1. 命令注入到底是什么:从一次代码审计说起1.1 一次真实的代码审计现场有次我给一个内部系统做代码审计,看的是一个导出报表的后端接口。功能很简单:用户填一个设备IP,系统后台ping这个IP,然后把连通结果写进日志文件。… · 2026/9/25 11:38:31

毕业论文像盖楼:云智变AI官网www.yunzhibian.cn帮你从地基到封顶不塌方,微信公众号搜一搜云智变AI
毕业论文像盖楼:云智变AI官网www.yunzhibian.cn帮你从地基到封顶不塌方,微信公众号搜一搜云智变AI

毕业论文最让人崩溃的时刻,往往不是“不会写”,而是写到第三章突然发现:第一章提出的问题,第三章的方法接不住;文献综述里找到的缺口,结论部分压根没回应;数据分析写了两千字,导师问… · 2026/9/25 11:38:31

Atlas 300V 24G推理加速卡部署YOLO实践指南
Atlas 300V 24G推理加速卡部署YOLO实践指南

1. Atlas 300V 24G到底是不是一张“运算加速卡”1.1 先给结论:它确实是,而且定位非常专一最近不少朋友在后台问我同一个问题:“Atlas 300V 24G是运算加速卡吗?”我猜很多人是因为在二手服务器整机或配件列表里看到这块卡&#xff… · 2026/9/25 11:38:25

SSTI模板注入实战:fenjing自动化穿越WAF的绕过工具指南
SSTI模板注入实战:fenjing自动化穿越WAF的绕过工具指南

前阵子做一次授权渗透测试,目标是个Flask写的内部系统。参数丢个{{7*7}}进去,页面直接回显49,SSTI模板注入实锤。但高兴没两秒——关键字被过滤,点号和下划线被过滤,连单双引号都给我拦了。手工试了一个多小时&#xf… · 2026/9/25 11:38:25

安卓应用安全进阶:APK解包、签名校验与组件导出防护
安卓应用安全进阶:APK解包、签名校验与组件导出防护

1. 为什么这篇叫“(二)”而不是“进阶”上一篇我们聊了安卓应用安全的基础面:Android 的系统架构、沙箱机制、数据目录划分、四大组件的基本概念,以及为什么说一个应用从安装到运行,安全边界比想象中要窄。很多朋友看过… · 2026/9/25 11:38:19

数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)
数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码