概览
SQL 性能问题往往并不是“数据库没有索引”,而是 SQL 结构本身限制了优化器可选择的执行路径。 例如:- 相关子查询重复执行
- 谓词无法下推
- OR 条件导致索引利用率下降
- 不必要的 DISTINCT 或 GROUP BY
- 深分页产生大量扫描与排序
- 分布式数据库中发生跨分片数据移动
为什么查询重写优化很重要
数据库优化器能够在给定 SQL 表达式范围内寻找最优执行计划,但不会总是主动改变 SQL 的业务表达形式。 某些 SQL 写法从语义上等价,却会产生完全不同的优化空间。 PawSQL 的查询重写优化用于扩展优化器可利用的搜索空间。核心能力
子查询重写
针对 IN、EXISTS、Scalar Subquery 等结构进行分析,寻找更适合目标数据库执行的等价形式。谓词优化
优化 WHERE / JOIN 条件,包括:- Predicate Pushdown
- 恒等条件与冗余条件消除
- OR 条件改写
- 表达式简化
- 可索引条件恢复
Join 优化
识别并处理:- 冗余 Join
- Join Elimination
- Join 顺序相关结构问题
- 可转化的子查询 Join
- 分布式环境中的跨分片 Join 风险
聚合优化
针对 DISTINCT、GROUP BY、COUNT、MIN/MAX 等聚合结构进行改写或简化。分页优化
对 OFFSET / LIMIT 等深分页场景生成更适合大数据量访问的改写方案。分布式 SQL 优化
针对分布式数据库进一步考虑:- 分布键
- 数据移动
- 跨节点 Join
- 复制表 / 广播表
- Global / Local Index
大数据 SQL 优化
针对 Hive 等大数据 SQL 场景分析:- Partition Pruning
- Bucket Join
- Data Skew
- COUNT DISTINCT
- GROUP BY Skew
- Window Skew
- Global Sort
示例
原始 SQL:语义安全性
查询重写优化首先必须保证语义正确。 因此,PawSQL 在应用重写规则时需要考虑:- NULL 语义
- 聚合语义
- DISTINCT
- 外连接语义
- 数据类型与隐式转换
- 数据库方言差异
- 函数与表达式行为