删除列或使用所需列重新创建表:哪个更好?

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 源表。

【讨论】:

以上是关于删除列或使用所需列重新创建表:哪个更好?的主要内容,如果未能解决你的问题,请参考以下文章

多个表的 SQL 结构

SQLITE 和自动索引

如何根据另一列的值创建空列或非空列?

索引(简介,创建,删除)

如果多个存储过程正在创建具有相同名称的临时表,我如何知道要删除哪个临时表?

哪个蜂巢表提供更好的性能?