Java 如何优化Postgres COPY的性能?
复制本身大约需要30秒。你会考虑这个合理的表现吗?我能做些什么来优化性能 原因:我必须一天几次批量插入数亿行。因此,当导入大约5亿行时,这将持续4小时Java 如何优化Postgres COPY的性能?,java,database,multithreading,postgresql,Java,Database,Multithreading,Postgresql,复制本身大约需要30秒。你会考虑这个合理的表现吗?我能做些什么来优化性能 原因:我必须一天几次批量插入数亿行。因此,当导入大约5亿行时,这将持续4小时 我怎样才能提高速度?切换到其他数据库?创建多线程并行导入?为什么不将循环中的行直接输入copyIn方法?在内存中构建一切似乎相当复杂。或者将100万行放入一个文件中,然后直接从该文件将行馈送到copyIn方法。我有一个csv文件,必须读取该文件,拆分行,取出不需要的内容,然后使用copy命令将其保存。这就是我在内存中构建它们的原因,将它们分块到例
我怎样才能提高速度?切换到其他数据库?创建多线程并行导入?为什么不将循环中的行直接输入copyIn方法?在内存中构建一切似乎相当复杂。或者将100万行放入一个文件中,然后直接从该文件将行馈送到copyIn方法。我有一个csv文件,必须读取该文件,拆分行,取出不需要的内容,然后使用copy命令将其保存。这就是我在内存中构建它们的原因,将它们分块到例如10k,并使用copy批量发送每个行。根据从文件中删除的行数,使用copy命令将它们全部插入临时表,然后使用insert仅将需要的行移动到目标表中可能会更快。。。选择…-但我会研究某种过滤读取器,您将其传递到copyIn方法中,并在将行发送到服务器时过滤行。如果我还必须转换某些列,该怎么办?过滤+转换是我在使用StringBuilder之前构建生成的csv行的主要原因。10k行批处理足够大,因此不会从变大中获得太多好处。看起来不错。是的,平行性可能会有所帮助。真的,你需要分析为什么这是缓慢的-寻找瓶颈。Java是否使用100%的CPU,因此无法跟上PostgreSQL的写入速度?PostgreSQL是否使磁盘上的写操作饱和?PostgreSQL是否进行了大量的索引查找外键,从而减慢了速度?表上是否有不必要的索引?等
CopyManager cp;
//loop until 1 million rows have been persisted
StringBuilder sb = new StringBuilder(); //build 10k entries, comma separated
cp.copyIn("COPY tableName FROM STDIN WITH CSV", new StringReader(sb.toString()));