【发布时间】:2016-10-22 20:42:09
【问题描述】:
我在一个系统上工作,该系统将数据从云系统下载到本地数据库(PostgreSQL、MySQL、...)。现在我遇到了 PostgreSQL 性能问题,因为插入数据需要很长时间。
列数和数据大小可能会有所不同。在一个示例项目中,我有一个大约有一个表。 170 列。有一个唯一索引 - 但即使删除索引后插入速度也没有改变。
我正在使用 JDBC 驱动程序连接到数据库,并且我正在以 250 行为单位批量插入数据(使用 NamedParameterJdbcTemplate)。
我花了大约。 在 Postgres 上插入数据需要 18 秒。 在 MySQL 上的相同数据集只花了我一秒钟。这是一个巨大的差异——它来自哪里? Postgres JDBC 驱动程序有那么慢吗?可以以某种方式对其进行配置以使其更快吗?我还缺少其他东西吗? Postgres 和 MySQL 之间的差异是如此巨大。任何其他想法如何使它更快?
我在 Github - https://github.com/varad/postgresql-vs-mysql 上创建了一个示例项目。一切都发生在 LetsGo class 中的 "run" 方法中。
【问题讨论】:
-
您可以启用更多调试以查看实际速度慢吗? (插入、提交、连接)?用于在 java 中调试(用于驱动程序) loglevel=2 (jdbc.postgresql.org/documentation/80/connect.html) 用于服务器端日志记录 drupal.org/node/560192
-
我们在谈论哪些版本?您是否尝试过交易?
-
另外,您是否尝试过反转并首先将其插入 MySQL 并查看会发生什么(例如
letsGo.run(Type.MYSQL); letsGo.run(Type.POSTGRES);)?还有你是怎么看时间的? -
请你这样做:
create table t1 as select * from your_table limit 250;然后pg_dump --inserts -t t2到一个文件,然后尝试在psql测量时间(\timing on开关)运行文件 - 这会给你预期insert的机器上 250 行的速度。然后创建索引等。并再次测量。 -
启用语句记录时,我可以看到该语句大约准备好了。在实际插入开始之前 20.000(是的 20 千)次。一旦实际插入开始,只需要大约。 1秒。但是 20.000 条准备语句在我的计算机上需要大约 30 秒。我不知道这是由 Spring 还是某些配置选项引起的。
标签: java postgresql jdbc