解决此问题的最佳方法是将400万条记录插入表中。实际上,您可以通过在视图中“批量插入”将它们放入带有标识列的表中。
create table TheIds (rownum int identity(1,1), id int);
create view v_TheIds (select id from TheIds);
bulk insert into v_TheIds . . .
有了数据库中的所有数据,您现在有了更多选择。尝试更新:
update t
set booleanfield = 1
where exists (select 1 from TheIds where TheIds.id = t.id)
您还应该在上创建索引TheIds(id)
。
这是一个很大的更新,全部作为一个事务执行。这可能会影响性能,并开始填充日志。您可以使用以下列将其分解为较小的交易rownum
:
update t
set booleanfield = 1
where exists (select 1 from TheIds where TheIds.id = t.id and TheIds.rownum < 1000)
这里的exist子句的作用等同于left outer join
。主要区别在于,这种相关的子查询语法应在其他数据库中工作,这些数据库中的更新联接是特定于数据库的。
使用该rownum
列,您可以选择要更新的任意多行。因此,如果整体更新太大,则可以将更新放入循环中:
where rownum < 100000
where rownum between 100000 and 199999
where rownum between 200000 and 299999
等等。您不必执行此操作,但是如果出于某种原因要批处理更新,则可以这样做。