文章摘要
pg_jitter是一个为PostgreSQL数据库设计的JIT(即时编译)优化工具,旨在提升查询执行性能。该项目托管在GitHub上,由开发者vladich维护。
文章总结
GitHub 项目 pg_jitter:为 PostgreSQL 提供更优的 JIT 编译方案
项目简介
pg_jitter 是一个轻量级的 PostgreSQL JIT(即时)编译扩展,提供三种替代后端方案: 1. sljit - 超快速编译(微秒级) 2. AsmJit - 擅长宽表行处理 3. MIR - 高可移植性方案
项目地址:https://github.com/vladich/pg_jitter
核心优势
- 编译速度:相比 PostgreSQL 默认的 LLVM 后端(毫秒级),pg_jitter 实现微秒级编译
- 执行性能:在多数场景下超越 LLVM 的执行效率
- 适用性:使 JIT 技术可应用于 OLTP 等轻量级查询场景
性能表现
| 后端 | 编译时间 | 典型加速效果 | 最佳场景 | |---------|---------------|--------------------|-------------------| | sljit | 10-100微秒 | 比解释器快5-25% | 通用场景 | | AsmJit | 数百微秒 | 宽表查询快达32% | 行变形操作 | | MIR | 数百微秒-毫秒 | 稳定提升 | 跨平台需求 | | LLVM | 数十-数百毫秒 | 多数场景较慢 | 复杂分析查询 |
技术特性
- 零配置:通过
jit_provider参数即可启用 - 运行时切换后端(无需重启)
- 支持 PostgreSQL 14-18
- 两级函数优化体系
- 无 LLVM 依赖
- 支持预编译函数内联
快速入门
构建要求
- PostgreSQL 14-18 开发头文件
- CMake ≥ 3.16
- C11/C++17 编译器
- 需将依赖库置于同级目录
典型构建命令
```bash
构建所有后端
./build.sh
构建单个后端
./build.sh sljit
自定义PostgreSQL路径
./build.sh --pg-config /opt/pg17/bin/pg_config all ```
配置示例
```sql -- 使用特定后端 ALTER SYSTEM SET jitprovider = 'pgjitter_sljit';
-- 或使用元提供者实现运行时切换 ALTER SYSTEM SET jitprovider = 'pgjitter'; SET pg_jitter.backend = 'asmjit'; -- 实时切换 ```
架构设计
- 表达式编译:实现 PostgreSQL 的 JitProviderCallbacks 接口
- 两级优化:
- Tier 1:值类型操作直接编译为原生调用
- Tier 2:引用类型操作通过 C 包装器调用
- 内存管理:与 PostgreSQL 资源所有者系统集成
- 版本兼容:单一代码库支持 PG14-18
当前状态
- 测试状态:通过所有 PostgreSQL 回归测试
- 稳定性:Beta 质量(尚缺大规模生产验证)
- 许可证:Apache 2.0
项目资源
- 基准测试脚本:
tests/目录下 - 多版本测试脚本:
./tests/run_all_versions.sh - ARM/x86 性能报告:参见项目 bench 目录
评论总结
以下是评论内容的总结,平衡呈现不同观点并保留关键引用:
关于JIT编译性能的争议
- 批评观点:LLVM-based JIT编译速度慢(数十到数百毫秒),可能仅适用于重型OLAP查询,且默认启用会导致性能不稳定。
引用:"standard LLVM-based JIT is notoriously slow... massive slowdown in some queries" (eru, fabian2k) - 优化建议:提出预编译(AOT)或缓存JIT结果的可能性。
引用:"good case for ahead of time compilation... caching your JIT results" (eru)
- 批评观点:LLVM-based JIT编译速度慢(数十到数百毫秒),可能仅适用于重型OLAP查询,且默认启用会导致性能不稳定。
技术改进的设想
- 用AI生成定制化编译器:
引用:"point AI at this problem... synthesize a bespoke compiler" (asah) - 对预编译的呼吁:
引用:"no reason for DB queries to not be precompiled" (sourcegrift)
- 用AI生成定制化编译器:
适用场景的讨论
- 质疑JIT在高并发短查询(OLTP)中的价值:
引用:"tested under high concurrency... lots of short OLTP queries?" (swaminarayan) - 对CPU密集型查询的困惑:
引用:"what sort of things... make them CPU bound?" (the_biot)
- 质疑JIT在高并发短查询(OLTP)中的价值:
其他意见
- 平台支持缺失:
引用:"no windows version yet" (larodi) - 对JIT生态的惊讶:
引用:"amazed to see... several generic JIT frameworks" (the_biot)
- 平台支持缺失:
总结呈现了性能争议(4条)、技术设想(2条)、场景适用性(2条)和次要观点(2条),引用覆盖所有核心观点。