📊 更新概览:2026年4月是一次以性能提升和算法优化为主线的迭代,涵盖SQL解析器性能优化、智能重写规则增强、多数据库方言支持等核心领域。
基于ANTLR 的SQL解析器在在进行 ATN → DFA 转换时会写入共享的 DFA 缓存,这个过程用了 synchronized 块:
// ANTLR 内部源码(ATNSimulator)
synchronized (sharedContextCache) {
// 写入 DFA state
}多线程并发解析时,所有线程争抢同一把锁,导致线程排队等待,吞吐量反而不如单线程。这个月针对 SQL解析引擎做了几项直击痛点的调整。
ANTLR 在首次触发规则时按需构建 DFA,冷启动代价明显。此次改动增加了两层预热:
pawsql.parser.warmup(对外呈现),由用户在应用部署时根据启动时间敏感度控制是否在初始化阶段走完整 DFA 构建。关闭时延迟加载,启动更快;开启时首请求解析延迟更低。
两个最频繁的调用路径——MySQL PL 语法和 PG 通用解析——都做了防御性加固:
+= 赋值解析:补齐了SQL脚本中复合赋值操作符,存储过程迁移时语法报错减少。PostgreSQLParser 增加对 @> 等包含特殊字符的谓词表达式的支持。SQL重写优化的核心矛盾在于:优化得越激进,正确性风险越大。本月几项修改都在尝试把下推和裁剪做得更精确。
RuleOrCond4SelectRewrite 做了三处调整,目标是提升重写优化之后的SQL的质量。-- 优化前,需检查主键列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;列上的运算导致索引失效 RuleFuncWithColumnInPredicate规则新增多项函数重写支持:
-- 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() 配置位,如果规则重写被关闭时,直接跳过对象构建和条件匹配,减少无效开销。current_date 这类无参函数在序列化输出时不再被错误添加括号。execQuery 收集,其余数据库使用 execUpdate:按数据库类型区分采集路径,避免因执行方式不匹配导致的统计信息采集失败。?,慢查询聚合时相同范式归并更准。🌐关于PawSQL
PawSQL是一款专业的企业级SQL质量管理和优化平台,提供SQL审核、优化、索引推荐、慢查询分析等全方位功能。支持MySQL、PostgreSQL、Oracle、SQL Server等主流数据库,以及TDSQL、GaussDB等国产数据库。为开发者和企业提供一站式的创新SQL质量审核和优化解决方案。
