Tulains Córdova Asked: 2013-09-17 10:05:33 +0800 CST2013-09-17 10:05:33 +0800 CST 2013-09-17 10:05:33 +0800 CST Oracle:截断大表需要很长时间 772 问题 我正在截断一个非常大的表(210+ 百万行)。 自开始以来已经有几个小时了,我不知道什么时候会完成。 有几个这样的表,我想截断。 数据库是 Ora9i。 问题 我怎样才能使截断更快? 另外,有没有办法查看截断操作的进度? performance truncate 2 个回答 Voted miracle173 2013-09-17T12:29:28+08:002013-09-17T12:29:28+08:00 我假设您正在使用字典管理的表空间。您必须等到所有扩展区都被释放。以下语句应报告要解除分配的区数: select extents from dba_segments where owner='TABLEOWNER' and segment_name='TABLENAME' 索引段和物化视图日志也必须被释放,如果它们存在的话。 如果您删除并重新创建表,您也将不得不等待。删除表将花费与截断表一样长的时间,因为要释放的范围数几乎相同。 也许以下内容会有所帮助:而不是丢弃并重新创建您 1) 将表 TABLENAME 重命名为 OLDTABLE 2) 使用原始名称 TABLENAME 创建一个新表。现在你有一个空表 TABLENAME 3) 你删除表 OLDTABLE 这种方法的优点是您可以在第 2 步之后继续使用表 TABLENAME。但是前表 TABLENAME 占用的空间将在第 3 步执行期间释放。在 Linux 中,您可以启动执行第 3 步的作业使用 nohup 作为背景,这样您就不能打开终端窗口。使用 nohup sqlplus user/password@tnsname @dropscript.sql &. 即使您想在执行第 3 步期间重新启动数据库,这也不是问题,因为 Oracle 可以处理这种情况。据我记得,它是通过以下方式执行此操作的:在实例重新启动后(或者如果删除表的会话由于其他原因而死),表的段将转换为临时段。它的范围由后台进程释放(我认为它是 smon)。该表在会话结束后从字典中删除,因此表名 OLDTABLE 在字典中不再可见。 Best Answer Tulains Córdova 2014-08-06T08:59:03+08:002014-08-06T08:59:03+08:00 最终解决我的问题是关闭存档模式,执行截断,然后重新打开存档模式。 启用存档模式后,截断时间过长并损坏了数据库。
我假设您正在使用字典管理的表空间。您必须等到所有扩展区都被释放。以下语句应报告要解除分配的区数:
索引段和物化视图日志也必须被释放,如果它们存在的话。
如果您删除并重新创建表,您也将不得不等待。删除表将花费与截断表一样长的时间,因为要释放的范围数几乎相同。
也许以下内容会有所帮助:而不是丢弃并重新创建您
1) 将表 TABLENAME 重命名为 OLDTABLE
2) 使用原始名称 TABLENAME 创建一个新表。现在你有一个空表 TABLENAME
3) 你删除表 OLDTABLE
这种方法的优点是您可以在第 2 步之后继续使用表 TABLENAME。但是前表 TABLENAME 占用的空间将在第 3 步执行期间释放。在 Linux 中,您可以启动执行第 3 步的作业使用 nohup 作为背景,这样您就不能打开终端窗口。使用
nohup sqlplus user/password@tnsname @dropscript.sql &
.即使您想在执行第 3 步期间重新启动数据库,这也不是问题,因为 Oracle 可以处理这种情况。据我记得,它是通过以下方式执行此操作的:在实例重新启动后(或者如果删除表的会话由于其他原因而死),表的段将转换为临时段。它的范围由后台进程释放(我认为它是 smon)。该表在会话结束后从字典中删除,因此表名 OLDTABLE 在字典中不再可见。
最终解决我的问题是关闭存档模式,执行截断,然后重新打开存档模式。
启用存档模式后,截断时间过长并损坏了数据库。