首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >PawSQL 引擎月度更新 | 2026年4月

PawSQL 引擎月度更新 | 2026年4月

作者头像
PawSQL
发布2026-06-17 20:46:16
发布2026-06-17 20:46:16
1230
举报

📊 更新概览:2026年4月是一次以性能提升和算法优化为主线的迭代,涵盖SQL解析器性能优化、智能重写规则增强、多数据库方言支持等核心领域。

一、SQL解析引擎:预热、缓存与语法容错

基于ANTLR 的SQL解析器在在进行 ATN → DFA 转换时会写入共享的 DFA 缓存,这个过程用了 synchronized 块:

代码语言:javascript
复制
// ANTLR 内部源码(ATNSimulator)
synchronized (sharedContextCache) {
    // 写入 DFA state
}

多线程并发解析时,所有线程争抢同一把锁,导致线程排队等待,吞吐量反而不如单线程。这个月针对 SQL解析引擎做了几项直击痛点的调整。

1.1 预热 ATN 与 DFA

ANTLR 在首次触发规则时按需构建 DFA,冷启动代价明显。此次改动增加了两层预热:

  • ATN 缓存预热:启动阶段提前加载规则元数据,绕过仿真的首次计算。
  • DFA 预热开关:增加系统变量 pawsql.parser.warmup(对外呈现),由用户在应用部署时根据启动时间敏感度控制是否在初始化阶段走完整 DFA 构建。关闭时延迟加载,启动更快;开启时首请求解析延迟更低。

1.2 SQL脚本解析器的健壮性补丁

两个最频繁的调用路径——MySQL PL 语法和 PG 通用解析——都做了防御性加固:

  • 缺分号语句提取:不再强制以分号作为语句边界,未闭合的 SQL 也能被正确切分。
  • += 赋值解析:补齐了SQL脚本中复合赋值操作符,存储过程迁移时语法报错减少。
  • PG 运算符扩展PostgreSQLParser 增加对 @> 等包含特殊字符的谓词表达式的支持。

二、查询重写:代价感知与下推边界

SQL重写优化的核心矛盾在于:优化得越激进,正确性风险越大。本月几项修改都在尝试把下推和裁剪做得更精确。

2.1 OR 条件 SELECT 重写的三项改进RuleOrCond4SelectRewrite 做了三处调整,目标是提升重写优化之后的SQL的质量。

  • 互斥分支不再补主键:优化器识别出分支互斥时(如 status = 'A' OR status = 'B' ),使用UNION ALL,选择列无需回填主键列。
代码语言:javascript
复制
-- 优化前,需检查主键列id,并回填
SELECT name FROM 
(
SELECT name, id FROM users WHERE status = 1 
UNION ALL
SELECT name, id FROM users WHERE status = 2
) t;
-- 优化后
SELECT name FROM users WHERE status = 1 
UNION ALL
SELECT name FROM users WHERE status = 2;
  • Limit/OrderBy 下推限制收紧:只有当外层不存在 GROUP BY 时,LIMIT 和 ORDER BY 才允许下沉到各个分支。避免在有分组语义的场景下产出错误结果。
  • 跨表同名列冲突解决:对不同基表但字段名重合的选择列做了别名隔离。

2.2 谓词下推、谓词函数重写增强与短路

  • 谓词下推 RuleFilterPredicatePushDownRewrite 层次由最多三层增加至五层,避免漏掉可能的优化机会。
  • 列上的运算导致索引失效 RuleFuncWithColumnInPredicate规则新增多项函数重写支持:
代码语言:javascript
复制
-- DATE_FORMAT 重写优化
-- 原查询
SELECT * FROM orders 
WHERE DATE_FORMAT(order_date, '%Y-%m-%d') = '2026-04-15';

-- 重写后(可利用索引)
SELECT * FROM orders 
WHERE order_date >= '2026-04-15 00:00:00' 
  AND order_date < '2026-04-16 00:00:00';

-- SUBSTR/SUBSTRING 等值重写
-- 原查询
SELECT * FROM products WHERE SUBSTR(code, 1, 3) = 'ABC';

-- 重写后(利用索引前缀)
SELECT * FROM products 
WHERE code LIKE 'ABC%';
  • 所有重写规则在初始化时检查 !isRewrite() 配置位,如果规则重写被关闭时,直接跳过对象构建和条件匹配,减少无效开销。

三、索引推荐与序列化

3.1 索引相关的两项调整

  • IndexClean 增加失败原因输出:残留索引清理失败时,日志中明确输出受阻原因,不再仅提示失败。
  • TDSQL 保留索引列方向:之前会抹掉索引列的 ASC/DESC 标记,现在根据业务侧建表语句原样保留。对于分布式场景下排序优化有直接影响。
  • 最大排序列阈值:新增阈值限制索引推荐时考虑 ORDER BY 候选列的数目,超过上限直接不考虑避免排序。

3.2 语法异常定位与序列化修复

  • 解析异常带行号:脚本执行报错时,错误信息中携带具体行号,省去在数百行脚本中定位的步骤。
  • DELETE ... USING 序列化:经过多轮修正,该语句在序列化/反序列化来回转换后保持一致。
  • 无括号系统函数current_date 这类无参函数在序列化输出时不再被错误添加括号。

四、统计信息收集路径与指纹优化

  • MySQL 统计信息通过 execQuery 收集,其余数据库使用 execUpdate:按数据库类型区分采集路径,避免因执行方式不匹配导致的统计信息采集失败。
  • SQL 指纹全量替换常量:指纹模块将语句中所有字面量替换为 ?,慢查询聚合时相同范式归并更准。

🌐关于PawSQL

PawSQL是一款专业的企业级SQL质量管理和优化平台,提供SQL审核、优化、索引推荐、慢查询分析等全方位功能。支持MySQL、PostgreSQL、Oracle、SQL Server等主流数据库,以及TDSQL、GaussDB等国产数据库。为开发者和企业提供一站式的创新SQL质量审核和优化解决方案。

图片
图片
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-05-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 PawSQL 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、SQL解析引擎:预热、缓存与语法容错
    • 1.1 预热 ATN 与 DFA
    • 1.2 SQL脚本解析器的健壮性补丁
  • 二、查询重写:代价感知与下推边界
    • 2.1 OR 条件 SELECT 重写的三项改进RuleOrCond4SelectRewrite 做了三处调整,目标是提升重写优化之后的SQL的质量。
    • 2.2 谓词下推、谓词函数重写增强与短路
  • 三、索引推荐与序列化
    • 3.1 索引相关的两项调整
    • 3.2 语法异常定位与序列化修复
  • 四、统计信息收集路径与指纹优化
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档