在将数据仓库批量数据加载到不需要日志logging的表中时,通常我的过程是:
这工作正常,但删除和重新创build索引可能会导致问题,所以我想知道是否人们认为这一步是必要的。 我了解到,从10g起,这样的索引创build被优化,以便索引在数据加载之后被重build。
任何人有任何这方面的经验?
你说删除和重新创build索引可能会产生问题。 另一种方法是将索引标记为不可用,然后重build它们。 这样他们的定义(名称,列,表空间等)从不“丢失”,即使某个步骤失败了。
因此,在第2步中循环表的所有索引并运行:
ALTER INDEX my_index_name UNUSABLE;
并在第4步循环索引并重build。 您可以指定nologging,所需的并行级别,索引压缩等:
ALTER INDEX my_index_name REBUILD NOLOGGING PARALLEL 16;
在一个干净的扫描中“逐行”地build立索引是更高效的。 在第一种情况下,Oracle执行一个全表扫描,对索引进行sorting和写入。 如果索引是在批量加载期间维护的,在加载过程中会一直进行更新,所以需要不断更新其叶节点,做更多的工作和I / O。 为什么? 因为每个索引块在加载的不同时间点将会被更新多次。
顺便说一句 – 希望你有一个“第5步” – 收集统计表和索引(并行)
除了我们批量加载到临时登台表然后转移到实际的表格之外,我们以几乎相同的方式进行。 我认为在数据加载之后创build索引是一个非常正常的ETL步骤,不应该引起任何问题。 这需要一些时间,但没有索引,它会变得更慢。 我们从来没有面临任何问题创build索引已填写表中。