从两个表中读取数据并使用批处理将其写入新表的更有效方法



我正试图编写一个spring批处理,将数据从两个表移动到一个表。我现在遇到了一个问题,我想了很多方法来解决这个问题,但我仍然想知道是否有更有效的方法来解决我的问题?基本上问题是,我有两个表,让我们称它们为table Atable B,它们的结构如下:

table A
column 1A   column 2A 
========   ========
bmw         123555
nissan      123456777
audi        12888
toyota      9800765
kia      85834945
table B
column 1B   column 2B
========   ========
12          caraudi
123456      carnissan
123         carbmw
0125        carvvv
88963       carbbn

我想做的是从批处理的wrtier创建一个表c,它只保存table B (column 1B and column 2B)column 1A的所有数据,而不会丢失两个表的任何数据,也不会写入基于列2A和列1B的重复数据。列A和列B在公共的(coulmn 1B == column 2A)中只有一列,但column 2A在每个id中都添加了一个3 digits suffix,所以如果我们进行连接和比较,我必须使用substr方法,这将非常慢,因为我有巨大的表。我想到的另一个解决方案是有一个表a的读取器,并将所有结果写入没有后缀的tempA表,然后另一个读取器比较表tempA和表B,并将数据写入表c,如下

table c
column 1A ( can be nullable because not all the records in column 2A exists in column 1B) 
column 1B
column 2B 

所以表格看起来像这个

table C
column 1c   column 2c   column 3c
=========   =========   =========
12          caraudi     audi
123456      carnissan   nissan
123         carbmw      bmw
0125        carvv       
88963       carbbn   
9800765                 toyota
85834945                kia     

这是解决问题的唯一方法吗?或者还有其他更有效的方法吗?提前感谢!

在放弃从表a到表B的LEFT OUTER JOIN(或者如果查询条件需要FULL OUTER JOIN)之前,请考虑使用db2expln或IBM Data Studio中的Visual Explain实用程序来确定在VARCHAR列上执行"以开始"匹配的一些替代方法的成本:

  • ON a.col2a LIKE b.col1b || '___'
  • ON a.col2a >= b.col1b || '000' AND a.col2a <= b.col1b || '999'

如果1b是CHAR列,则在将其他字符连接到它之前,可能需要修剪掉它的尾部空格:RTRIM( b.col1b ) || '000'

假设列1b是索引的,那么一个或另一个基于前缀的匹配谓词将使这两个表之间的连接比创建、填充和连接到自己的临时表更便宜。如果我错了(或者有其他复杂因素),临时表最终是最好的选择,请确保使用声明的全局临时表(DGTT),这样可以避免填充它的日志开销。

最新更新