【发布时间】:2016-03-25 06:46:53
【问题描述】:
我正在使用临时表更新我的表数据,这需要很长时间,但仍未完成。所以我收集了一个关于查询的解释计划。有人可以建议我如何调整查询或在其上构建索引。
查询:
UPDATE w_product_d A
SET A.CREATED_ON_DT = (SELECT min(B.creation_date)
FROM mtl_system_items_b_temp B
WHERE to_char(B.inventory_item_id) = A.integration_id
and B.organization_id IN ('102'))
where A.CREATED_ON_DT is null;
解释计划:
Plan hash value: 1520882583
-----------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------------------------
| 0 | UPDATE STATEMENT | | 47998 | 984K| 33M (2)|110:06:25 |
| 1 | UPDATE | W_PRODUCT_D | | | | |
|* 2 | TABLE ACCESS FULL | W_PRODUCT_D | 47998 | 984K| 9454 (1)| 00:01:54 |
| 3 | SORT AGGREGATE | | 1 | 35 | | |
|* 4 | TABLE ACCESS FULL| MTL_SYSTEM_ITEMS_B_TEMP | 1568 | 54880 | 688 (2)| 00:00:09 |
-----------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter("A"."CREATED_ON_DT" IS NULL)
4 - filter("B"."ORGANIZATION_ID"=102 AND TO_CHAR("B"."INVENTORY_ITEM_ID")=:B1)
Note
-----
- dynamic sampling used for this statement (level=2)
【问题讨论】:
-
如果我是你,我会考虑在 (integration_id, created_on_dt) 的 w_product_d 上添加一个索引。并且可能是 (to_char(inventory_item_id)) 的 mtl_system_items_b_temp 上基于函数的索引
-
我看到这种更新如果改成对应的
MERGE语句会快很多
标签: sql oracle indexing sql-execution-plan