Nick Pierpoint Asked: 2009-06-04 02:49:56 +0800 CST2009-06-04 02:49:56 +0800 CST 2009-06-04 02:49:56 +0800 CST Oracle 是否在批量数据加载后优化索引创建 772 在将数据仓库批量数据加载到我不需要记录的表中时,通常我的过程是: 截断表 删除索引 插入 /*+ 追加 */ 重新创建索引而不记录 这工作正常,但删除和重新创建索引可能会导致问题,所以我想知道人们是否认为这一步是必要的。我了解到,从 10g 开始,优化了此类索引的创建,以便在数据加载本身之后重新构建索引。 有人有这方面的经验吗? database oracle 2 个回答 Voted Best Answer Ofir Manor 2009-06-06T12:40:36+08:002009-06-06T12:40:36+08:00 你说删除和重新创建索引会产生问题。另一种方法是标记索引不可用,然后重建它们。这样,即使某些步骤失败,它们的定义(名称、列、表空间等)也永远不会“丢失”。 因此,在步骤 2 中循环遍历表的所有索引并运行: ALTER INDEX my_index_name 无法使用; 并在第 4 步中循环索引并重建。您可以指定 nologging、所需的并行级别、索引压缩等: ALTER INDEX my_index_name REBUILD NOLOGGING PARALLEL 16; 一次干净地构建索引然后“逐行”构建索引更有效。在第一种情况下,Oracle 执行一次全表扫描、排序和写入索引。如果在批量加载期间维护索引,则在加载期间它一直在更新,因此它需要不断更新它的叶子块,做更多的工作和 I/O。为什么?因为每个索引块将在加载的不同时间点更新几次。 顺便说一句 - 希望你有一个“步骤 5” - 收集表和索引的统计信息(并行) Leonid Shirmanov 2009-06-05T02:34:40+08:002009-06-05T02:34:40+08:00 除了批量加载到临时登台表然后转移到实际表之外,我们几乎采用相同的方式。我认为在数据加载后创建索引是一个非常正常的 ETL 步骤,应该不会造成任何问题。这需要一些时间,但如果没有索引,它会慢得多。我们从未遇到过在已填写的表上创建索引的任何问题。
你说删除和重新创建索引会产生问题。另一种方法是标记索引不可用,然后重建它们。这样,即使某些步骤失败,它们的定义(名称、列、表空间等)也永远不会“丢失”。
因此,在步骤 2 中循环遍历表的所有索引并运行:
ALTER INDEX my_index_name 无法使用;
并在第 4 步中循环索引并重建。您可以指定 nologging、所需的并行级别、索引压缩等:
ALTER INDEX my_index_name REBUILD NOLOGGING PARALLEL 16;
一次干净地构建索引然后“逐行”构建索引更有效。在第一种情况下,Oracle 执行一次全表扫描、排序和写入索引。如果在批量加载期间维护索引,则在加载期间它一直在更新,因此它需要不断更新它的叶子块,做更多的工作和 I/O。为什么?因为每个索引块将在加载的不同时间点更新几次。
顺便说一句 - 希望你有一个“步骤 5” - 收集表和索引的统计信息(并行)
除了批量加载到临时登台表然后转移到实际表之外,我们几乎采用相同的方式。我认为在数据加载后创建索引是一个非常正常的 ETL 步骤,应该不会造成任何问题。这需要一些时间,但如果没有索引,它会慢得多。我们从未遇到过在已填写的表上创建索引的任何问题。