owo*_*ook 12 performance oracle
我有一个数据仓库 (oracle),我需要将所有 7 亿行的列设置为相同的值。
我没有管理员权限,也没有管理员权限,所以这需要使用基本的 sql 来完成,并且没有创建临时表。
更复杂的问题是,如果我尝试在 1=1 的情况下进行简单的更新,它会耗尽重做空间。
我现在运行它的方式是循环如下:
loop
update mytable set mycolumn = '1' where mycolumn is null and rownum < 50000;
commit;
end loop
Run Code Online (Sandbox Code Playgroud)
但我知道这可能很幼稚,必须有一个更快、更优雅的解决方案。
如果您有空间,您可以使用最少的撤消/重做进行 CTAS。如果您有任何索引,那么以任何其他方式执行都会非常慢并且会疯狂地生成日志记录。
如果您有一个没有任何二级索引的 IOT 或单个表簇,您可以分块逐步更新主键/簇键,而无需重新扫描整个表来查找尚未更新的字段。
- 编辑
我无法创建辅助表...有几个索引,但它们都不涉及我正在更新的列。
然后我建议将表分成块,以便使用您正在索引的内容进行处理(即使它是单个列,您也可以将其拆分为值范围),这将执行一次 FTS,而不是像您中那样为每个块执行一次 FTS代码。您将不得不忍受大量的重做,并且也会清除您的撤消空间(因此随后不会出现闪回)
--编辑2
如果你可以添加/重命名/删除列,你可以非常有效地做到这一点,但仅限于 11g