在具有 400k 行的表上运行相同的查询(带有几个 INNER JOIN 的 SELECT)时,在 Mac OS X 上比在 Linux 或 Windows 7 上花费的时间几乎长 30 倍。当然,硬件配置不同,但没有区别足以保证如此大的差异。我能够在几台运行 Mac OS X 10.6 的计算机上重现性能问题。奇怪的是,在长查询执行过程中杀死 H2 并让 H2 在下次启动时修复数据库后,我得到了一次预期的性能。但是,我无法始终如一地重现这一点。
我在 Mac OS X 上注意到的是,在提交查询几秒钟后,CPU 和磁盘使用率几乎都降到了零,并且只有在返回查询结果之前才回升。
测试计算机安装了以下 Java 版本:
- Mac OS X:Java(TM) SE 运行时环境(内部版本 1.6.0_24-b07-334-10M3326)Java HotSpot(TM) 64 位服务器 VM(内部版本 19.1-b02-334,混合模式)
- Linux:Java(TM) SE 运行时环境(构建 1.6.0_20-b02)、Java HotSpot(TM) 64 位服务器 VM(构建 16.3-b01,混合模式))
- Windows:Java(TM) SE Runtime Environment (build 1.6.0_24-b07) Java HotSpot(TM) 64-Bit Server VM (build 19.1-b02,混合模式)
所有计算机都运行 H2 1.1.117。虽然我知道这个版本已经很老了,但我现在更愿意继续使用它,但我需要解决这个明显特定于平台的性能问题。我用谷歌搜索了错误报告,但没有找到任何相关的东西。