Oracle插入索引表:加载50万行的时间超过插入1600万行

时间:2017-10-03 08:54:50

标签: oracle sql-insert oracle9i

首先,我尝试从临时表中正常插入目标表。

INSERT /*+ APPEND */ INTO RDW10DM.INV_ITEM_LW_DM
SELECT
    *
FROM
    RDW10PRD.TMP_MDS_RECLS_INV_ITEM_LW_DM
;
COMMIT;

加载仅需17分钟。临时表TMP_MDS_RECLS_INV_ITEM_LW_DM中的总计数为16491650。 执行计划:

--------------------------------------------------------------------------------------
| Id  | Operation            |  Name                         | Rows  | Bytes | Cost  |
--------------------------------------------------------------------------------------
|   0 | INSERT STATEMENT     |                               |    16M|  1290M|  4927 |
|   1 |  LOAD AS SELECT      |                               |       |       |       |
|   2 |   TABLE ACCESS FULL  | TMP_MDS_RECLS_INV_ITEM_LW_DM  |    16M|  1290M|  4927 |
--------------------------------------------------------------------------------------
Note: cpu costing is off

然后我尝试加载loc wise:

INSERT /*+ APPEND */ INTO RDW10DM.INV_ITEM_LW_DM
SELECT
        *
FROM
     RDW10PRD.TMP_MDS_RECLS_INV_ITEM_LW_DM
     where LOC_KEY=222
;
COMMIT;

然后加载大约需要28分钟。带过滤器的临时表中的总计数为493465

执行计划:

--------------------------------------------------------------------------------------
| Id  | Operation            |  Name                         | Rows  | Bytes | Cost  |
--------------------------------------------------------------------------------------
|   0 | INSERT STATEMENT     |                               |   492K|    38M|  4927 |
|   1 |  LOAD AS SELECT      |                               |       |       |       |
|*  2 |   TABLE ACCESS FULL  | TMP_MDS_RECLS_INV_ITEM_LW_DM  |   492K|    38M|  4927 |
--------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter("TMP_MDS_RECLS_INV_ITEM_LW_DM"."LOC_KEY"=222)

Note: cpu costing is off

目标表中的索引: enter image description here

有没有人知道为什么会这样?

2 个答案:

答案 0 :(得分:0)

我的猜测? TMP表没有索引。

因此 - 选择所有记录并插入它们比在16Mil记录上应用过滤器更快。

正如您所看到的,在您的第二个执行计划中,扫描程序正在使用FULL ACCESS,这会降低查询速度。尝试在TMP_MDS_RECLS_INV_ITEM_LW_DM(LOC_KEY)上添加索引。它应该提高您的查询性能。

答案 1 :(得分:0)

感谢大家的宝贵意见。

我后来发现了实际问题。由于我经常在目标表RDW10DM.INV_ITEM_LW_DM中进行截断和加载,因此索引页可能已经碎片化。 因此,在重建索引并获得预期结果后运行查询。