0

在具有 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。虽然我知道这个版本已经很老了,但我现在更愿意继续使用它,但我需要解决这个明显特定于平台的性能问题。我用谷歌搜索了错误报告,但没有找到任何相关的东西。

4

1 回答 1

1

这不太可能与操作系统有关。

如果 CPU 和磁盘使用率都为零,我建议获取完整的线程转储(jps -l,然后jstack -l <pid>)以了解进程在做什么。

你运行了ANALYZE吗?顺便说一句,在较新版本的 H2 (1.3.x) 上不再需要这样做。

如果这不是问题,我建议查看Database Performance Tuning文档。我知道,很多都是通用的,但它可能仍然有帮助。如果这仍然不能解决问题,请参阅应用程序分析并使用您找到的结果更新问题。

于 2011-03-25T10:16:54.010 回答