如何使用talend和sql server更快地加载数据

Kro*_*war 8 sql-server upsert database-performance talend

我使用Talend将数据加载到sql-server数据库中.

看来我工作中最薄弱的部分不是数据处理,而是数据库中的有效负载,不超过17行/秒.

有趣的一点是,我可以同时启动5个工作,并且它们都将以17个/秒的速度加载.

什么可以解释这种缓慢,我怎样才能提高速度?

谢谢

新信息:

我的桌面和服务器之间的传输速度大约是1MByte

我的工作每10 000工作一次

我使用sql server 2008 R2

我用于工作的模式是这样的:

在此输入图像描述

yda*_*coR 15

数据库INSERT OR UPDATE方法非常昂贵,因为数据库无法批量处理所有提交,并且必须逐行执行(ACID事务强制执行此操作,因为如果它尝试执行插入然后失败,那么此处的所有其他记录提交也会失败).

相反,对于大型批量操作,最好在将提交传递给数据库然后将2个事务发送到数据库之前预先确定是否插入或更新记录.

需要此功能的典型作业将汇编要生成的数据,INSERT OR UPDATEd然后在数据库表中查询现有主键.如果主键已经存在,那么您可以将其作为一个发送UPDATE,否则它是一个INSERT.可以在tMap组件中轻松完成此操作的逻辑.

插入或更新作业示例

在这项工作中,我们希望将一些数据INSERT OR UPDATE放入包含一些预先存在的数据的数据库表中:

最初加载的数据

我们希望将以下数据添加到其中:

插入或更新数据

该作业通过将新数据放入tHashOutput组件中来工作,因此可以在同一作业中多次使用它(它只是将其放入内存或在大型实例中可以将其缓存到磁盘).

接下来,从一个tHashInput组件中读出大量数据并直接读入一个tMap.另一个tHashInput组件用于对表运行参数化查询:

参数化查询 参数配置

您可能会发现Talend指南和参数化查询很有用.从这里返回的记录(所以只有数据库中的记录)才被用作查找tMap.

然后将其配置为INNER JOIN查找需要UPDATEDINNER JOIN要插入的拒绝的记录:

tMap配置

然后,这些输出只是流向单独的tMySQLOutput组件UPDATEINSERT根据需要流动.最后,当主要的子工作完成时,我们就会commit发生变化.


Kro*_*war 0

我找到了这个性能问题的根源。

我做了一个INSERT OR UPDATE,如果我用一个简单的替换它INSERT,速度会上升到4000行/秒。

这看起来是一个可以接受的节奏吗?

无论如何,我需要我的INSERT OR UPDATE所以,我想我被困住了。