【问题标题】:create index before adding columns vs. create index after adding columns - does it matter?在添加列之前创建索引与在添加列之后创建索引 - 这有关系吗?
【发布时间】:2011-08-04 16:51:58
【问题描述】:

在Oracle 10g 中,create index 和alter table 的顺序是否重要?

假设我有一个查询 Q,在表 T 的列 C 上有一个 where 子句。现在我执行以下场景之一:

  1. 我创建索引 I(C),然后添加列 X、Y、Z。
  2. 添加列 X、Y、Z,然后创建索引 I(C)。

Q 是“从 T 中选择 *,其中 C = 随便什么”

1和2之间,当T包含非常多的行时,Q在表T上的性能会有显着差异吗?

我个人习惯于做 #2,但其他人似乎有不同的看法。

谢谢

【问题讨论】:

    标签: oracle


    【解决方案1】:

    在创建索引之前或之后向表中添加列没有区别。优化器应该为查询选择相同的计划并且执行时间应该保持不变。

    根据表的物理存储参数,添加额外的列并用数据填充它们可能会强制执行相当多的行迁移。该行迁移将对表上的索引产生更改。如果在使用数据填充三个新列时存在索引,则由于额外的索引维护,在 X、Y 和 Z 中填充数据可能需要更长的时间。

    【讨论】:

      【解决方案2】:

      如果您添加列而不填充它们,那么它会非常快,因为它只是元数据更改。添加索引确实需要读取表(或可能需要读取另一个索引),因此与记录新索引详细信息的简单元数据更改相比,这可能非常耗时且影响更大。

      如果要填充新列作为 ALTER TABLE 的一部分,则另当别论。

      1. 在将数据添加到表数据的每一行的过程中,数据库可能会意外关闭
      2. 服务器内存可能没有空间来记录该表中更改的每一行
      3. 因此,这些行更改可能会在提交之前写入数据文件,因此会被写入脏块
      4. 在 ALTER 表成功完成后,对这些块的下一次读取将执行延迟块清除(即记录已提交更改的事实)

      如果您首先添加列(带有数据),那么创建索引将(可能)读取表并执行延迟块清除的添加工作。

      如果您先创建索引然后添加列,则创建索引可能会更快,但不会发生延迟的块清除,并且稍后将由应用程序进行内务处理(可能由select * from T where C = whatever

      【讨论】:

        猜你喜欢
        • 2011-01-10
        • 2015-10-20
        • 2018-04-10
        • 2013-03-30
        • 2021-11-12
        • 2014-08-25
        • 1970-01-01
        • 1970-01-01
        • 2011-04-10
        相关资源
        最近更新 更多