暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 删除带有CLOB列的行的最佳实践

ASKTOM 2020-08-05
1590

问题描述

环境: Exadata上的Oracle 12.1.0.2



我有一个包含30列的表,其中一个是CLOB,其中包含大约2600万行。



我有一个清除作业 (PL/SQL打包过程),它基于包含CLOB的驱动程序表中的id列表从九 (9) 个其他表中删除行。



我将id列表保存在全局临时表中,并使用该列表从其他表中删除关联行,这些表以正确的顺序完成以维护所有FK关系。



我今天正在运行一个测试,已经确定了大约98,000个要清除的id,但是我有大约500万个需要清除才能 “赶上”,然后我每天将有大约10,000个要清除的id。



其他9个表上的DELETE运行非常快。



带有CLOB列的表比其他表花费的时间长很多倍,例如几个小时而不是几分钟。



我猜想有一种更好,更有效的方法可以从包含CLOB的表中删除行,并重新获得已删除的CLOB使用的存储空间。



我目前仅发出 “从 中删除ID,其中ID在 (从 中选择ID,其中ID是PK。



对于 “追赶” 和日常10,000,我将不胜感激。



提前感谢所有的帮助!!非常感谢!



-加里


专家解答

对于初始清除,要从26m中删除5m,最好使用create-table-as-select,其中仅查询要保留的21m行。

对于日常运行 (或任何较小的规模),我们确实需要浪费时间。所以你可以这样做:

-执行dbms_monitor.session_trace_enable (等待 =>true)
-[运行您的删除]
-执行dbms_monitor.session_trace_disable (等待 =>true)
-查询V $ DIAG_INFO以获取跟踪文件的名称

然后在上面运行tkprof,看看时间在哪里丢失。

随时将其发布到此处作为评论,我们将对其进行检查
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论