Oracle insert in index table:Time加载50万行比插入1600万行多

Oracle insert in index table:Time to load 500 thousand rows is more than inserting 16 million rows

起初我尝试从临时 table.

正常插入目标 table
INSERT /*+ APPEND */ INTO RDW10DM.INV_ITEM_LW_DM
SELECT
    *
FROM
    RDW10PRD.TMP_MDS_RECLS_INV_ITEM_LW_DM
;
COMMIT;

仅用了 17 分钟,load.Total 的温度计数 table 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 分钟。带过滤器的临时 table 中的总计数为 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

目标中的索引table:

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

我猜? TMP table 没有索引。

因此 - 选择所有记录并插入它们比对 1600 万条记录应用过滤器更快。

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

感谢大家的宝贵意见。

我后来发现了真正的问题。由于我经常在目标 table RDW10DM.INV_ITEM_LW_DM 中进行截断和加载,因此索引页面可能已经碎片化。 所以,运行重建索引后查询,得到了预期的结果。