删除列或使用所需列重新创建表:哪个更好?
Posted
技术标签:
【中文标题】删除列或使用所需列重新创建表:哪个更好?【英文标题】:drop column or re-create table using required column : which is better? 【发布时间】:2015-02-19 09:13:10 【问题描述】:我需要从表中删除大约 200 列(未编入索引)。该表包含大量记录(大约 300 万条)。我尝试了两种不同的方法来删除这些列:
-
使用“alter table drop column ...”语句单独删除列。
例如:ALTER TABLE AO_PO_DTL_SCHEDULE_BKP1 DROP (shipto_jurisdiction_code,mark_po_box,..);
或者
ALTER TABLE AO_PO_DTL_SCHEDULE_BKP4 SET UNUSED (shipto_jurisdiction_code,mark_po_box,...)
ALTER TABLE AO_PO_DTL_SCHEDULE_BKP4 删除未使用的列;
使用所需列重新创建表并从原始表中导入记录。
但是,这两种方法都需要很长时间才能完成(大约 30 分钟/表)和我们有大约 10 个表可以在生产环境停机 4 小时内完成这项活动。
我想知道有什么不同的方法可以用来删除这些列,或者如果以上两种方法是唯一的方法,那么从表中删除这些列的最佳方法是什么:
在 drop 之后,我们有什么命令可以重新组织表结构吗? 我正在使用 oracle 11g。感谢您的帮助。
【问题讨论】:
如果有外键或其他依赖,drop column 可能是唯一的选择。 @jarlh 不,没有外键或与其他表的任何类型的关系,并且它没有可用于将要删除的列的索引。 您是否必须在停机期间删除它们 - 您可以将它们标记为未使用吗?然后可能会在未来的维护窗口中分批丢弃它们?剩下多少列,它们是否被大量索引,是否有任何用作外键(不确定您是说没有 FK,还是没有引用被删除的列)? 【参考方案1】:最好从特定表中的所需列创建表,如下所示
create table sample_cpy
as
select sno,name,dept from sample;
如果您只想要表结构,请使用如下所示
create table sample_cpy
as
select sno,name,dept from sample where rownum < 1;
以上这些方法不会创建任何index,primary,foriegn key etc
。
如果一切正常,您可以delete
源表。
【讨论】:
以上是关于删除列或使用所需列重新创建表:哪个更好?的主要内容,如果未能解决你的问题,请参考以下文章