我是PDI的新手,我使用PDI 7,我有6行的excel输入,并希望将其插入postgresDB。我的转变是:EXCEL INPUT - > Postgres Bulk Loader(仅限2步)。
条件1:当我运行转换时,Postgres批量加载不会停止,也不会在我的postgresDB中插入任何内容。
条件2:所以,我添加"插入/更新"继Postgres Bulk Loader之后,将所有数据插入postgresDB,这意味着成功,但批量加载器仍在运行。
从我可以得到的所有来源,他们只需要输入和Bulk Loader步骤,并且在完成转换之后,批量加载器已经完成了#34; (我的"跑步")。所以,我想问一下Postgres如何正确地使用它?我是否跳过重要的事情?感谢。
答案 0 :(得分:1)
PostgreSQL批量加载器过去只是实验性的。有一段时间没试过。你确定需要它吗?如果您从Excel加载,则不太可能有足够的行来保证使用批量加载器。
尝试常规的Table Output
步骤。如果您只是插入,则不需要Insert/Update
步骤。
答案 1 :(得分:0)
要插入7行,您不需要批量加载器。 批量加载器旨在加载大量数据。它使用本机psql客户端。 PSQL客户端更快地传输数据,因为它使用二进制协议的所有功能,而不受jdbc规范的任何限制。 JDBC用于表输出等其他步骤。大部分时间表输出足够了。
Postgres Bulk Loader步骤只是从传入的步骤以csv格式构建内存数据,并将它们传递给psql客户端。
答案 2 :(得分:0)
我做了一些实验。
环境:
结果在下面以帮助您做出决定
批量加载程序:13-15秒左右平均每秒超过150_000行
表输出(sql插入):平均每秒11_500行。总计约为3分18秒
表输出(批量插入,批量大小10_000):平均每秒28_000行。总计约1分30秒
表输出(批量插入5个线程批量大小3_000):每个线程平均每秒7_600行。意味着每秒约37_000行。总时间约为59秒。
Buld loader的优点是不会填充jmv的内存,所有数据都会立即流入psql进程。
表输出用数据填充jvm内存。实际上在大约1_600_000行之后内存已满且启动了gc。 CPU加载时间高达100%,速度显着降低。这就是为什么值得玩批量大小,找到能提供最佳性能(更大更好)的价值,但在某种程度上导致GC开销。
上一次实验。提供给jvm的内存足以容纳数据。这可以在变量PENTAHO_DI_JAVA_OPTIONS中调整。我将jvm堆大小的值设置为1024mb并增加批量大小的值。
答案 3 :(得分:0)
慢插入/更新步骤 为什么你必须避免使用插入/更新(如果处理了大量数据或者你受到时间的限制)?
让我们看一下文档
“插入/更新”步骤首先使用一个或中查找表中的一行 更多查找键。如果找不到该行,则会插入该行。如果它 可以找到并且要更新的字段是相同的,没有做任何事情。 如果它们不完全相同,则表中的行会更新。
在状态之前,对于流步骤中的每一行将执行2个查询。首先查找然后更新或插入。 PDI Kettle的来源指出PreparedStatement用于所有查询:插入,更新和查找。
因此,如果这一步是瓶颈,那么试着弄清楚究竟是什么慢。
无论如何,这一步很慢,因为它需要大量的网络通信和水壶中的数据处理。
使速度更快的唯一方法是将数据库中的所有数据加载到“temp”表中,并将调用函数加载数据。或者只是在job中使用简单的sql步骤来做同样的事情。