我需要在Oracle 10g数据库中对表(~30,000条记录)进行批量更新。挑战在于没有“where”子句可以选择目标行。但是,每个目标行可以通过复合键来识别。这里的问题是复合键列表来自外部源(不在数据库中)。
目前我有一个Java程序,它遍历复合键列表并吐出一个PL / SQL过程,它基本上只是一堆重复的update
语句,类似于以下内容:
update table1 t set myfield='Updated' where t.comp_key1='12345' and t.comp_key2='98765';
有没有更好的方法来做到这一点,或者考虑到我们只处理约30K的记录,这是否“足够好”?
答案 0 :(得分:3)
可能已经足够好了,但是如果密钥的外部源是文件,则创建一个指向该文件的外部表,将文件中的数据作为关系表公开,然后您可以在合并中执行此操作(更新)声明。
答案 1 :(得分:2)
足够好。
使用主键进行30,000次更新,即使它们都经过硬解析,通常也只需要几秒钟。正如@Ed Gibbs建议的那样,你可以通过组合更新来加快速度。但到目前为止,这似乎是一个非常快速的过程,不值得优化。将它全部放在一个PL / SQL过程中是一个明智的举措,并且节省了99%的时间,这是一个真正天真的,逐行的客户端解决方案所需的时间。