首页 > 解决方案 > 与 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

标签: javapostgresqlhibernate

解决方案


这取决于但原则上运行更多查询很少是解决方案。在走这条路线之前,至少应该执行几个步骤:

  1. 在查询上运行EXPLAIN并尝试优化瓶颈,也许有可以避免的全表扫描?
  2. 确保 3 个相似的查询共享相同的执行计划。您的代码不使用绑定参数,这意味着您有 3 个不同的执行计划,这很可能是浪费的。
  3. 在 Hibernate(hibernate.jdbc.fetch_size属性)和 JDBC 驱动程序中配置正确的提取大小。对于 10,000 行和 10 行的通常提取大小,驱动程序仍然需要对数据库执行 1,000 次往返。如果您的数据库延迟为 100 毫秒,那么仅网络往返就相当于 100 秒。
  4. 使用只读会话优化 Hibernate 会话以报告查询。
  5. 优化 Hibernate 查询,也许你不需要加载实体,只需要几列投影就足够了。

要了解瓶颈在哪里以及要优化什么,请尝试分析数据库服务器中的 SQL 查询。您想了解需要多少时间:

  1. 从客户端发送 SQL 查询
  2. 将 SQL 查询解析为执行计划
  3. 执行计划以产生行
  4. 将行发送回客户端

一个好的设计方法是为您的数据库设置一个只读副本,仅用于报告。这允许将 OLTP 处理与 OLAP 处理分开并分别优化双方,这更容易。


推荐阅读