Oracle 通过 ROWID 批量更新表
Oracle 通过 ROWID 批量更新表
在 Oracle 数据库中,使用 ROWID 进行批量更新是一种高效的更新方法,因为它直接定位到物理行位置,避免了通过索引查找的开销。
ROWID 基本概念
ROWID 是 Oracle 数据库中每一行的唯一物理地址标识符,包含以下信息:
- 数据对象号
- 数据文件号
- 数据块号
- 行号
批量更新方法
- 获取当前表的rowid
- 以rowid为条件进行update
- 每更新5000行则commit
DECLARE maxrows number default 5000; row_id_table dbms_sql.Urowid_Table; cursor acnt_first_cur is SELECT /*+parallel(h,8) */h.rowid from pos5g_rw.mstb_order_header h order by h.rowid; begin open acnt_first_cur; loop exit when acnt_first_cur%notfound; fetch acnt_first_cur bulk collect into row_id_table limit maxrows; forall i in 1 .. row_id_table.count update pos5g_rw.mstb_order_header h set name=null where rowid = row_id_table(i); commit; end loop; end; /
性能优化建议
- 批量提交:对于大量数据更新,每处理1000-10000行提交一次
- NOLOGGING:如果允许,使用NOLOGGING选项减少重做日志生成
- 并行处理:考虑使用并行DML(需要ALTER SESSION ENABLE PARALLEL DML)
- 索引考虑:更新后重建或更新相关索引统计信息
注意事项
- ROWID 可能会在表重组、分区移动等操作后发生变化
- 使用 ROWID 更新时不会触发基于函数的索引
- 在分布式数据库中,ROWID 不能跨数据库使用
通过合理使用 ROWID 进行批量更新,可以显著提高 Oracle 数据库中大表更新的性能。