用集算器更新数据库的技巧

对数据库进行批量更新时,使用update函数要比execute函数性能更好。算法

好比,source和target是两个不一样的数据源,callrecordA是source中的物理表,有1万条记录,callrecordB是target中的物理表,无记录,如今须要将callrecordA中的数据同步到callrecordB中。sql

当使用execute函数进行批量更新,能够发现性能不够理想,代码以下:数据库

image.png

上述算法实际是循环执行insert语句,并无充分利用JDBC的批量更新机制,所以性能较差。并且上述算法只是插入数据,若是既有插入又有修改,处理起来会麻烦许多。oracle

使用update函数后,能够看到性能提高明显,代码以下:函数

image.png

函数update利用JDBC的executeBatch机制进行批量更新,所以性能较好。选项@i表示只需生成insert语句,@u表示只生成update语句。无选项时表示既有insert又有update,即目标表已有数据,需比对源表和目标表的主键,若是某主键在源表存在,在目标表不存在,则生成insert语句,若是某主键在源表和目标表都存在,则生成update语句。工具

数据库一般会提供同步/导入工具,这些工具一般具有更好的性能,也都支持命令行调用。SPL可执行命令行,所以能够调用这些工具。好比用oracle的sqlldr导入数据,可以使用以下代码:性能

image.png

A1-A3:将source中的表导出成文本文件,分隔符为|。文本文件若是已存在,则可省略本步骤。spa

A4:执行命令行,调用sqlldr,命令格式要符合sqlldr的官方要求。注意callrecordB.ctl 是sqlldr要求的控制文件,格式以下:命令行

image.png

SPL支持并行计算,包括并行执行同步/导入工具,因此能够将单文本拆成多个文本,同时导入多个文件,以此得到更高性能。不一样的同步/导入工具,有不一样的并行要求,一般的要求是不锁表,且无惟一索引。好比并行执行sqlldr,可用以下代码:3d

image.png

相关文章
相关标签/搜索