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 中进行截断和加载,因此索引页面可能已经碎片化。
所以,运行重建索引后查询,得到了预期的结果。
起初我尝试从临时 table.
正常插入目标 tableINSERT /*+ 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 中进行截断和加载,因此索引页面可能已经碎片化。 所以,运行重建索引后查询,得到了预期的结果。