我有一个包含数据的CSV / TSV文件,并想将该CSV数据加载到数据库中。我正在使用Java或Python和PostgreSQL来执行此操作(无法更改)。
问题在于,对于每一行我都会执行INSERT查询,如果我说有600.000行,效率就不那么高。有没有更有效的方法呢?
我想知道是否可以容纳更多行并仅创建一个大查询并在数据库上执行它,但是我不确定这是否有帮助,还是应该将数据分成100个并执行100个查询?
答案 0 :(得分:2)
如果CSV文件与copy from stdin
要求的格式兼容,那么最有效的方法是使用CopyManager
API。
有关示例代码,请参见this answer或this answer。
如果输入文件与Postgres的复制命令不兼容,则需要自己编写INSERT。但是您可以通过使用JDBC批处理来加快过程:
大致情况:
PreparedStatement insert = connection.prepareStatement("insert into ...");
int batchSize = 1000;
int batchRow = 0;
// iterate over the lines from the file
while (...) {
... parse the line, extract the columns ...
insert.setInt(1, ...);
insert.setString(2, ...);
insert.setXXX(...);
insert.addBatch();
batchRow ++;
if (batchRow == batchSize) {
insert.executeBatch();
batchRow = 0);
}
}
insert.executeBatch();
在JDBC URL中使用reWriteBatchedInserts=true
可以进一步提高性能。
答案 1 :(得分:0)
假设服务器可以直接访问文件,则可以尝试使用COPY FROM命令。如果您的CSV格式不正确,则将其转录为COPY命令将要处理的内容(例如,复制到服务器可以访问的位置时)的速度可能仍然更快。