java - 与 PostgresSQL 9 并行运行 3 个大型选择调用是否值得?
问题描述
我们需要提高从 PostgreSQL 视图获得的报告的性能。对 10k 行进行选择大约需要 2-5 分钟,这是报告生成中最耗时的部分。它们在同一个视图上运行,Hibernate 用于连接数据库,查询作为 SQL 查询执行
SQLQuery query = session.createSQLQuery(query);
List<Object> data = query.list();
报告的三个查询与选择的许多列相似:
SELECT amount, rate, channel, date ...etc
FROM view
WHERE channel = 'name'
AND invoice_id = '1'
AND date < 12 Oct
是否值得并行运行这些选择,或者这些调用的性能可能会随着更大的数据集而进一步下降?
我读到必须为并行选择使用不同的连接。有人可以建议如何使用 Hibernate 实现这一点吗?
解决方案
这取决于但原则上运行更多查询很少是解决方案。在走这条路线之前,至少应该执行几个步骤:
- 在查询上运行
EXPLAIN
并尝试优化瓶颈,也许有可以避免的全表扫描? - 确保 3 个相似的查询共享相同的执行计划。您的代码不使用绑定参数,这意味着您有 3 个不同的执行计划,这很可能是浪费的。
- 在 Hibernate(
hibernate.jdbc.fetch_size
属性)和 JDBC 驱动程序中配置正确的提取大小。对于 10,000 行和 10 行的通常提取大小,驱动程序仍然需要对数据库执行 1,000 次往返。如果您的数据库延迟为 100 毫秒,那么仅网络往返就相当于 100 秒。 - 使用只读会话优化 Hibernate 会话以报告查询。
- 优化 Hibernate 查询,也许你不需要加载实体,只需要几列投影就足够了。
要了解瓶颈在哪里以及要优化什么,请尝试分析数据库服务器中的 SQL 查询。您想了解需要多少时间:
- 从客户端发送 SQL 查询
- 将 SQL 查询解析为执行计划
- 执行计划以产生行
- 将行发送回客户端
一个好的设计方法是为您的数据库设置一个只读副本,仅用于报告。这允许将 OLTP 处理与 OLAP 处理分开并分别优化双方,这更容易。
推荐阅读
- python - UpdateView 不保存数据,在 url 中返回对象字段数据
- python - 根据python中的过滤列表检查列表
- r - 将 SQLServer 表直接传输到 R 中的 DuckDB
- github - 如何从 Github 的源代码文件中只获取一些行?
- python - Numpy 3D数组最大值和最小值
- java - 在 Java 上运行规范霍夫曼代码的参考代码问题
- python - 我如何遍历 Python 中所有声明的变量?
- python - pywinauto 查看屏幕上不可见的列表项
- database - 从 Microsoft SQL Server Mangement Studio 导出数据库
- git - 操作系统更新后 AWS Credential Helper 停止工作