I'm issuing the following query:
Select Id, AssignedOn,
(
SELECT gn.Name FROM GeoNode gn WHERE gn.Id =
(
SELECT MIN(t.StartPointId) KEEP (dense_rank FIRST ORDER BY t.StartTime1)
FROM Task t
WHERE t.Id IN
(
SELECT TaskId
FROM ResourceAssignment
WHERE TargetResourceId = ra.TargetResourceId AND SourceResourceId = ra.SourceResourceId
)
)
) as DepartureNodeName
FROM
ResourceAssignment ra;
the "Explain Plan" shows me TABLE ACCESS (FULL) on "TASK" table, I want to get rid of it.
The query basically wants to take StartPointId
where StartTime1
is minimum from Task table based on saved Task ids.
Edit:
Execution plan is given bellow, you can see the cost and access of Task table:
Plan hash value: 3000073173
------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 281 | 11521 | 3 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID | GEONODE | 1 | 24 | 2 (0)| 00:00:01 |
|* 2 | INDEX UNIQUE SCAN | PK_GEONODE | 1 | | 1 (0)| 00:00:01 |
| 3 | SORT AGGREGATE | | 1 | 25 | | |
|* 4 | FILTER | | | | | |
| 5 | TABLE ACCESS FULL | TASK | 15618 | 381K| 68 (0)| 00:00:01 |
|* 6 | TABLE ACCESS BY INDEX ROWID| RESOURCEASSIGNMENT | 1 | 30 | 2 (0)| 00:00:01 |
|* 7 | INDEX RANGE SCAN | PK_RESASSIGNMENT_SOURCE_TARGET | 5 | | 1 (0)| 00:00:01 |
| 8 | TABLE ACCESS FULL | RESOURCEASSIGNMENT | 281 | 11521 | 3 (0)| 00:00:01 |
------------------------------------------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - SEL$2 / GN@SEL$2
2 - SEL$2 / GN@SEL$2
3 - SEL$3
5 - SEL$3 / T@SEL$3
6 - SEL$4 / RESOURCEASSIGNMENT@SEL$4
7 - SEL$4 / RESOURCEASSIGNMENT@SEL$4
8 - SEL$1 / RA@SEL$1
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("GN"."ID"= (SELECT MIN("T"."STARTPOINTID") KEEP (DENSE_RANK FIRST ORDER BY
"T"."STARTTIME1") FROM "TASK" "SYS_ALIAS_1" WHERE EXISTS (SELECT 0 FROM "RESOURCEASSIGNMENT"
"RESOURCEASSIGNMENT" WHERE "TARGETRESOURCEID"=:B1 AND "SOURCERESOURCEID"=:B2 AND "TASKID"=:B3)))
4 - filter( EXISTS (SELECT 0 FROM "RESOURCEASSIGNMENT" "RESOURCEASSIGNMENT" WHERE
"TARGETRESOURCEID"=:B1 AND "SOURCERESOURCEID"=:B2 AND "TASKID"=:B3))
6 - filter("TASKID"=:B1)
7 - access("SOURCERESOURCEID"=:B1 AND "TARGETRESOURCEID"=:B2)
Column Projection Information (identified by operation id):
-----------------------------------------------------------
1 - "GN".ROWID[ROWID,10], "GN"."NAME"[NVARCHAR2,1000]
2 - "GN".ROWID[ROWID,10]
3 - (#keys=0) MIN("T"."STARTPOINTID") KEEP (DENSE_RANK FIRST ORDER BY "T"."STARTTIME1")[22]
4 - "T"."STARTPOINTID"[NUMBER,22], "T"."STARTTIME1"[NUMBER,22]
5 - "T"."ID"[NUMBER,22], "T"."STARTPOINTID"[NUMBER,22], "T"."STARTTIME1"[NUMBER,22]
6 - "RESOURCEASSIGNMENT".ROWID[ROWID,10], "TASKID"[NUMBER,22]
7 - "RESOURCEASSIGNMENT".ROWID[ROWID,10]
8 - "ID"[NUMBER,22], "SYS_ALIAS_7"."SOURCERESOURCEID"[NUMBER,22],
"SYS_ALIAS_7"."TARGETRESOURCEID"[NUMBER,22], "ASSIGNEDON"[TIMESTAMP,11]