Oracle批量更新优化方法
Oracle 的批量更新方法里,用虚拟表技术来替代传统的EXISTS
子句,是个挺值得试一试的优化思路。尤其是在成千上万条库存或出库记录的时候,传统写法那种一条条查再一条条更新的方式,太慢了,服务器压力也大。
用的是类似“结果集里直接更新”的方式,看起来有点像把多张表先临时合成一张,对着它一次性更新。写法也不复杂,用UPDATE
套个SELECT
,再加个BYPASS_UJVC
提示,就搞定了:
UPDATE (
SELECT /*+BYPASS_UJVC*/
bl.material_id AS bl_material_id,
ibdb.material_id AS ibdb_material_id
FROM scm_barcode_location bl,
scm_input_bill_detail_barcode ibdb
WHERE bl.bar_code = ibdb.bar_code
AND ibdb.input_detail_id = 439201812
)
SET bl_material_id = ibdb_material_id;
这种方法的好处是,更新过程都在一个查询结果里完成,少了多 IO 操作,响应也快。嗯,适合那种出库单或者条码库比较大的场景。
也不是万能的。这个写法最大的瓶颈,其实是在那个SELECT
本身。所以前提是你这个查询别太夸张,字段和索引得配好。
如果你用 Oracle 开发 ERP 或者做库存相关系统,不妨试试这个方法,真能省下不少性能开销。
下载地址
用户评论