我正试图编写一个spring批处理,将数据从两个表移动到一个表。我现在遇到了一个问题,我想了很多方法来解决这个问题,但我仍然想知道是否有更有效的方法来解决我的问题?基本上问题是,我有两个表,让我们称它们为table A
和table 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),这样可以避免填充它的日志开销。