H2 性能建议
H2 performance recommendations
我目前正在使用一个更大的数据库,虽然我没有具体问题,但如果有人有任何建议,我想要一些建议。
数据库为 2.2 GB(在 recreation/compacting 之后)。它包含大约 50 tables。其中一个 table 包含一个 blob 和一些元数据。它目前有大约 22000 行。如果我从 table 中删除 blob(UPDATE table SET blob = null),数据库大小将减少到大约 200 兆字节(在 recreation/compacting 之后)。元数据被大量访问,但是并不经常需要 blob。
我目前使用的数据库URL是:
jdbc:h2:D:/data;AUTO_SERVER=true;MVCC=true;CACHE_SIZE=524288
它在我们的 Java 虚拟机中运行,该虚拟机具有 4GB 最大堆。
我想知道的一些事情:
- 单独进程中的 运行 H2 会对性能产生任何影响(好还是坏)?
- 将 blob 放在单独的 table 中并与元数据保持 1-1 关系会有帮助吗?我可以想象它会有助于缓存,而不是让 blob 挡道?
- 互联网似乎对是否将 blob 包含在数据库中或将它们写入文件系统上的文件中存在分歧,数据库中带有 link。这里有任何 H2 特定的建议吗?
您的答案取决于您的 blob 数据的增长率。例如,如果您的数据集将以每周 10% 的速度增长——那么尝试扩展 H2 的使用来存储 blob 数据就没有什么意义了(因为它会很快超过可用堆内存的速度)。相反,如果 blob 数据是最大的,那么尝试使用 H2 可能 是有意义的。
回答你关于 H2 的问题:
1) 运行 单独进程中的 H2 将允许 H2 占用大部分堆 space - 使控制 H2 的可用堆 space 更易于管理。但是,您还将增加维护和监控单独流程的维护开销。所以答案是"it depends on your operating environment and goals"。如果你有时间和人,运行 H2 在一个单独的过程中可能是有意义的。但如果这是真的 - 那么您可能应该只考虑 运行 一个合适的 blob 存储平台。
2) 是的,您是正确的,将 blob 存储在单独的 table 中将有助于缓存 - 在您不经常需要 blob 的情况下。它还应该有助于缩短检索时间,因为 H2 不必读取 blob 来查找元数据。
3) 请注意,"the internet" 代表成千上万的人,他们拥有几乎同样多的不同特定用例。您需要将您的用例过滤为需求,然后应用您从其他人那里收集的逻辑。
4) 我的个人建议是,如果您正在尝试构建一个可扩展且可维护的平台,请使用正确的工具。 H2 或任何其他关系数据库通常不是存储许多大型 blob 的正确工具。我建议您使用 key/value 商店进行调查。
我目前正在使用一个更大的数据库,虽然我没有具体问题,但如果有人有任何建议,我想要一些建议。
数据库为 2.2 GB(在 recreation/compacting 之后)。它包含大约 50 tables。其中一个 table 包含一个 blob 和一些元数据。它目前有大约 22000 行。如果我从 table 中删除 blob(UPDATE table SET blob = null),数据库大小将减少到大约 200 兆字节(在 recreation/compacting 之后)。元数据被大量访问,但是并不经常需要 blob。
我目前使用的数据库URL是:
jdbc:h2:D:/data;AUTO_SERVER=true;MVCC=true;CACHE_SIZE=524288
它在我们的 Java 虚拟机中运行,该虚拟机具有 4GB 最大堆。
我想知道的一些事情:
- 单独进程中的 运行 H2 会对性能产生任何影响(好还是坏)?
- 将 blob 放在单独的 table 中并与元数据保持 1-1 关系会有帮助吗?我可以想象它会有助于缓存,而不是让 blob 挡道?
- 互联网似乎对是否将 blob 包含在数据库中或将它们写入文件系统上的文件中存在分歧,数据库中带有 link。这里有任何 H2 特定的建议吗?
您的答案取决于您的 blob 数据的增长率。例如,如果您的数据集将以每周 10% 的速度增长——那么尝试扩展 H2 的使用来存储 blob 数据就没有什么意义了(因为它会很快超过可用堆内存的速度)。相反,如果 blob 数据是最大的,那么尝试使用 H2 可能 是有意义的。
回答你关于 H2 的问题:
1) 运行 单独进程中的 H2 将允许 H2 占用大部分堆 space - 使控制 H2 的可用堆 space 更易于管理。但是,您还将增加维护和监控单独流程的维护开销。所以答案是"it depends on your operating environment and goals"。如果你有时间和人,运行 H2 在一个单独的过程中可能是有意义的。但如果这是真的 - 那么您可能应该只考虑 运行 一个合适的 blob 存储平台。
2) 是的,您是正确的,将 blob 存储在单独的 table 中将有助于缓存 - 在您不经常需要 blob 的情况下。它还应该有助于缩短检索时间,因为 H2 不必读取 blob 来查找元数据。
3) 请注意,"the internet" 代表成千上万的人,他们拥有几乎同样多的不同特定用例。您需要将您的用例过滤为需求,然后应用您从其他人那里收集的逻辑。
4) 我的个人建议是,如果您正在尝试构建一个可扩展且可维护的平台,请使用正确的工具。 H2 或任何其他关系数据库通常不是存储许多大型 blob 的正确工具。我建议您使用 key/value 商店进行调查。