我有一个包含超过 18 亿行的 Oracle 表,我需要删除最多 2.6 亿行。
我是一名 Microsoft SQL DBA,因此不太熟悉 Oracle 语法和此类过程的最佳实践。
- CTAS 感觉不是一个好的选择,因为我需要删除较少的行数
- 标准版因此无法使用 MOVE ONLINE INCLUDING ROWS
任何建议和意见将不胜感激。
我有一个包含超过 18 亿行的 Oracle 表,我需要删除最多 2.6 亿行。
我是一名 Microsoft SQL DBA,因此不太熟悉 Oracle 语法和此类过程的最佳实践。
任何建议和意见将不胜感激。
拥有 18 亿行,您确实应该拥有 EE。到目前为止,最好的方法是重新创建不包含要删除的行的表。格式化新块,尤其是直接路径,比更新现有块要快得多。删除行需要更多的重做、更多的撤消、当前块读取、索引维护、位图空间管理、可能的并发问题(锁、ITL 可用性等)、可能的触发器或外键查找等……Oracle 做了很多工作用于更新和删除。然而,在创建新段并加载它 (CTAS) 时,大部分内容都会被绕过。
差异如此之大,以至于您必须删除表中非常小的
DELETE
一部分才能使实际操作值得。你说的是15%。这远远超过了选择 CTAS 的门槛。基本概念是:
如果您绝对不想完成索引、约束、授权等的所有脚本...您可能会选择将数据移动两次,以便它最终位于原始段中,尽管这会增加更多时间:
至少我在 EE 中是这样做的。我不相信没有 EE 并行性就行不通,但即使没有并行性,方法也应该是相同的。
CTAS with
NOLOGGING
是删除约 15% 的大表的非常好的选择。带参数的导出+导入
QUERY
是另一个非常相似的概念。由于表不可用,这两种方法都需要额外的存储空间和应用程序停机时间。
其他方法将花费更长的时间或需要企业版功能。