Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 更新具有数百万条记录的多个列_Sql_Oracle - Fatal编程技术网

Sql 更新具有数百万条记录的多个列

Sql 更新具有数百万条记录的多个列,sql,oracle,Sql,Oracle,我有一个包含数百万条记录的表,并添加了两个新列 alter table hr.employees add (ind char(1Byte), remove Char(1 Byte)); commit; 我有另一个视图hr.department,它有更多的数据,并且有这两列 因此,如果我为这些记录编写和更新,需要很长时间 update hr.employees a set (ind, remove) =(select ind, remove from

我有一个包含数百万条记录的表,并添加了两个新列

alter table hr.employees add (ind char(1Byte), remove Char(1 Byte)); commit;
我有另一个视图
hr.department
,它有更多的数据,并且有这两列

因此,如果我为这些记录编写和更新,需要很长时间

update hr.employees a 
set (ind, remove) =(select ind, remove 
                    from hr.department b 
                    where a.dept_id = b.dept_id ) ;

已经一个小时了,它仍然在更新中。有人能帮上忙吗?

处理此更新的最简单方法可能是:

  • 找一个没有其他人会严格使用系统的时间
  • 备份
  • 如果它们不存在,请复制DDL以在该表上创建所有索引/约束
  • 删除该表上的所有索引/约束
  • 更新你的两列
  • 重新创建索引/约束(这可能需要一些时间,但通常比使用多个索引更新大表中的每一行要少几个数量级)

  • 与往常一样,Burleson Consulting是一个很好的资源:

    处理此更新的最简单方法可能是:

  • 找一个没有其他人会严格使用系统的时间
  • 备份
  • 如果它们不存在,请复制DDL以在该表上创建所有索引/约束
  • 删除该表上的所有索引/约束
  • 更新你的两列
  • 重新创建索引/约束(这可能需要一些时间,但通常比使用多个索引更新大表中的每一行要少几个数量级)

  • 与往常一样,Burleson咨询是一个很好的资源:

    如果您的表有数百万行,那么使用
    更新很可能会花费太多时间

    我将重命名旧表,创建一个新表,其中新列已经填充,然后添加索引、约束、注释和收集统计数据

    RENAME employees to employees_old;
    
    CREATE TABLE employees AS
    SELECT a.col1, a.col2, ... a.coln, b.ind, b.remove 
      FROM employees_old a
      LEFT JOIN department b
        ON a.dept_id = b.dept_id;
    

    如果您的表有数百万行,那么使用
    更新
    很可能会花费太多时间

    我将重命名旧表,创建一个新表,其中新列已经填充,然后添加索引、约束、注释和收集统计数据

    RENAME employees to employees_old;
    
    CREATE TABLE employees AS
    SELECT a.col1, a.col2, ... a.coln, b.ind, b.remove 
      FROM employees_old a
      LEFT JOIN department b
        ON a.dept_id = b.dept_id;
    

    可能与执行计划重复,或者您是否检查了执行计划?如果hr.department中的dept\u id列未编入索引,则查询将耗时。可能与执行计划重复,或者您是否已检查执行计划?如果hr.department中的dept_id列没有索引,查询将需要很长时间。事实上,Burleson网站是一个相当不稳定的建议来源,有一些有用的东西和一些完全错误的建议。你发布的链接就是一个很好的例子,其中的建议已经有将近二十年的历史了(对Oracle 9i的引用是免费的)。实际上,Burleson网站是一个相当不稳定的建议来源,有一些有用的东西,还有一些完全错误的建议。您发布的链接就是一个很好的例子,其中的建议已经有近二十年的历史了(Oracle 9i的参考资料就是一个赠品)。这是我所见过的最成功的解决方案—用这些更改构建一个新表,然后删除现有的并切换这是我见过的最成功的解决方案——用更改构建一个新表,然后删除现有的并切换