【发布时间】:2015-09-16 18:48:56
【问题描述】:
我有以下查询。由于其中的子查询,这会降低性能。我尝试了很多来添加加入而不是子查询。但徒劳无功。谁能告诉我如何使用 JOIN 重写这个查询?
update Table_1
set status = 'Status_2'
where status ='status_1' and (col_1, col_2, col_3, nvl(col_4,0), col_5) in (
select col_1, col_2, col_3, nvl(col_4,0), col_5 from Table_2 where status ='Status_0');
请看下面的SELECT * FROM table(DBMS_XPLAN.Display);
Plan hash value: 1290346170
------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------------------------------
| 0 | UPDATE STATEMENT | | 1 | 376 | 456 (3)| 00:00:06 |
| 1 | UPDATE | Table_1 | | | | |
| 2 | NESTED LOOPS | | | | | |
| 3 | NESTED LOOPS | | 1 | 376 | 456 (3)| 00:00:06 |
| 4 | SORT UNIQUE | | 1 | 316 | 454 (3)| 00:00:06 |
|* 5 | TABLE ACCESS FULL | Table_2 | 1 | 316 | 454 (3)| 00:00:06 |
|* 6 | INDEX RANGE SCAN | Table1_INDEX | 1 | | 1 (0)| 00:00:01 |
|* 7 | TABLE ACCESS BY INDEX ROWID| Table_1 | 1 | 60 | 1 (0)| 00:00:01 |
------------------------------------------------------------------------------------------------------
【问题讨论】:
-
请运行
EXPLAIN PLAN FOR your_query,然后运行SELECT * FROM table(DBMS_XPLAN.Display),然后复制其输出并将其粘贴到问题中。 -
@kordirko,请看一下结果。
-
@Msn 估计时间只有6秒,相当快。查询实际花费的时间是多少?
-
查询只查找 table2 中的 1 行,只更新 table1 中的 1 行,您想改进什么?这个计划是最优的。顺便说一句,您还没有向我们展示完整的解释计划,此表后面有一个谓词信息
-
我认为你可以使用
EXISTSinstead ofIN;)。
标签: sql database oracle query-optimization sql-tuning