首先,我尝试从临时表中正常插入目标表。
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
有没有人知道为什么会这样?
答案 0 :(得分:0)
我的猜测? TMP表没有索引。
因此 - 选择所有记录并插入它们比在16Mil记录上应用过滤器更快。
正如您所看到的,在您的第二个执行计划中,扫描程序正在使用FULL ACCESS
,这会降低查询速度。尝试在TMP_MDS_RECLS_INV_ITEM_LW_DM(LOC_KEY)
上添加索引。它应该提高您的查询性能。
答案 1 :(得分:0)
感谢大家的宝贵意见。
我后来发现了实际问题。由于我经常在目标表RDW10DM.INV_ITEM_LW_DM中进行截断和加载,因此索引页可能已经碎片化。 因此,在重建索引并获得预期结果后运行查询。