Sql 如何改进大型表的更新

Sql 如何改进大型表的更新,sql,oracle,oracle11g,informatica,Sql,Oracle,Oracle11g,Informatica,我正在尝试改进informaticapresql命令的性能,该命令在不使用where子句(将一列更新为null)的情况下更新一个大表(100mil记录)。 这花了我一个多小时,我必须得到更好的结果。。 任何关于如何改进它的想法都会很好。。 提前谢谢。 该表有3个索引和主键 账户 子帐户 酪蛋白 没有分区 现在是 Update table1 set column1 = null 您可以启用并行dml&hint来提高性能 alter session enable parallel dml; U

我正在尝试改进informaticapresql命令的性能,该命令在不使用where子句(将一列更新为null)的情况下更新一个大表(100mil记录)。 这花了我一个多小时,我必须得到更好的结果。。 任何关于如何改进它的想法都会很好。。 提前谢谢。 该表有3个索引和主键 账户 子帐户 酪蛋白

没有分区

现在是

 Update table1 set column1 = null

您可以启用并行dml&hint来提高性能

alter session enable parallel dml;

UPDATE /*+ full(t) parallel (t 8) */ table1 t set column1 = null ;

您可以查看整篇文章。

或者,如果您真的不需要WHERE:

alter table table1 drop column column1 ;

alter table table1 add column column1  column1_datatype default NUll ;

<>这将是很快的:

你也可以考虑每100000行提交一次。

declare
  n_num number;
begin
  n_num := 0;
  for x in (select rowid rid from table1) loop
    Update table1 set column1 = null where rowid = x.rid;
    n_num := n_num + 1;
    if mod(n_num,100000) = 0 then
      commit;
    end if;
  end loop;
  commit;
end;

如果我们看不到你的代码,我们如何优化它呢?现在它只是一个普通的更新。表结构呢?索引、外键约束、触发器等将极大地影响这样的更新的性能。我们需要知道该列上是否存在触发器、索引或约束。如果有,最好在更新过程中临时禁用或删除它们。该列上没有索引或约束,并且该表没有触发器。是否有其他人同时向该表写入,阻止写入并导致重试?只更新需要更新的内容,
updatetable1 set column1=null,其中column1不为null
。删除并添加列?并行化查询,这可能需要提示。更大更快更好的硬件。我考虑过这一点,但我可以改变表的结构和顺序。你可以删除,但你不能改变?有点奇怪,但是你至少应该使用并行更新,不能两者兼而有之。。我来试试这个,你为什么不能改变?那么你是如何发展的呢?我不明白,那么你真的需要问问合适的私人。您可以使用CREATETABLE作为select语句。我想,若您无法更改和/或创建表,那个么您将无法获得更好的结果,请与您的DBA联系,我将尝试此方法。谢谢