【问题标题】:Oracle - Adding columns to a table takes foreverOracle - 向表中添加列需要很长时间
【发布时间】:2012-05-12 05:18:38
【问题描述】:

我需要将两个 DATE 列添加到已经存在的表中。但这需要很长时间,我必须终止该过程。奇怪的是我能够暂时将这些列添加到同一数据库中的其他表中。这些表中的大多数都比我在数据和列计数方面都遇到问题的表大。我必须做什么才能添加这些新列?

【问题讨论】:

  • 什么版本的Oracle?您是添加默认值还是仅添加列?桌子有多大?什么是“很长”?小时?天?
  • 它是 Oracle 10g。是的,我将 SYSDATE 作为默认值添加到这些列之一。该表有 11 列的 3.923.327 条记录。花了 6 多分钟,我只是中断了这个过程。
  • 该表有多少行?
  • IMO 6 分钟不是“长时间”。六分钟“比我想要的要长,但是,嘿,这有将近 400 万条记录,我会坐在这里,让它磨蹭,嘿,让我们检查一下统计数据,看看发生了什么,呵呵,很高兴我为此得到报酬嗯 垃圾机器里有什么 哎呀 是时候在大厅里快速旅行了 dang 这件事还在继续吗 嘿团队昨天做得怎么样 人力资源部门的她的名字怎么了 听说她和那个老人是斯普利特维尔 确定我已经有时间问什么是栗色当当......嘿,它完成了!”。这大约是六分钟的长度。 :-)
  • 是的,但你怎么知道需要多长时间?我在第六分钟杀死了进程。大概需要半个多小时。

标签: oracle alter-table


【解决方案1】:

在 Oracle 11g 中添加一个 varchar2(4000) 列没有默认值一个 61K 行表时,我也遇到了这个问题。 30 分钟后,色谱柱仍未添加。

我尝试中止操作并重试,但仍然没有完成。

什么有效:
我尝试添加一个数字列,这花了一瞬间。放弃了。
然后我尝试添加一个 varchar2(1) 列,这需要一瞬间。放弃了。
然后我尝试再次添加一个 varchar2(4000) 列,它只花了一瞬间。

愚蠢的“解决方法”,但也许这也适用于其他面临此问题的人。

【讨论】:

    【解决方案2】:

    这是我解决问题的方法。之前,我在添加列时为列指定了默认值。但后来我首先添加了没有默认值的列。添加列后,我指定了默认值,它立即执行,无需等待。非常感谢@Justin Cave 关于默认值的提示。这是关键。

    毫无疑问,这与在添加列时指定默认值时,默认值被写入之前插入的所有记录这一事实有关。因此,如果表中有 500 万条记录,则该表将更新为所有行的新添加列设置默认值。正如人们所猜测的那样,更新 500 万条记录的成本很高。但是如果在添加列之后设置了默认值,那么之前插入的行中新列的值将是 NULL,因此不会发生更新。

    【讨论】:

    • @Jens - 这是因为稍后添加默认值不会影响现有行,而添加新列时,必须在每一行上设置默认值 - 除非默认值为 NULL,在在这种情况下,Oracle 不必访问现有行。
    • 需要注意的是,在Oracle 11g中,添加具有默认值的列不再有这个问题(Oracle不会更新所有现有的行,而只是更新元数据)。
    • 我在 PostgreSQL 9.2 中遇到了类似的问题。我正在添加一个没有任何默认值的字符变化(50)的新列。我的表包含大约 100 万条记录,但查询在过去 1 小时内执行并且仍在执行中。请帮忙。这是我给出的查询:ALTER TABLE ccdb.consumer_index_details ADD COLUMN rapdrp_pole_code character varying(50);
    猜你喜欢
    • 2015-07-30
    • 1970-01-01
    • 2023-03-10
    • 2021-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-03
    相关资源
    最近更新 更多