首先,空字符串在 Oracle 中相当于 NULL。
您正在以最有效的方式执行此操作。您正在一次更新中更新整个表;所以你在这里几乎没有选择。最明显的事情是并行化。
如果您使用的是 Oracle 企业版,则可以使用PARALLEL 提示:
update /*+ parallel(tablename, 4) */ tablename
set col1 = <some stuff>
, col2 = null
4 这里是并行会话的数量。
如果您使用的是标准版,那么值得一看DBMS_PARALLEL_EXECUTE;这会将您首先更新的表分块,然后并行执行 UPDATE:
declare
l_sql varchar2(32767);
l_status number;
begin
dbms_parallel_execute.create_task ('mytask');
dbms_parallel_execute.create_chunks_by_rowid
('mytask', user, 'TABLENAME', true, 10000);
l_sql := 'update /*+ rowid (dda) */ tablename
set col1 = <some stuff>
, col2 = null
where rowid between :start_id and :end_id';
dbms_parallel_execute.run_task
( 'mytask', l_sql, dbms_sql.native, parallel_level => 4);
l_status := dbms_parallel_execute.task_status('mytask');
if l_status = dbms_parallel_execute.finished then
dbms_parallel_execute.drop_task('mytask');
end if;
end;
/
另一种选择当然是升级基础设施......