Oracle FAQ | Your Portal to the Oracle Knowledge Grid |
![]() |
![]() |
Home -> Community -> Usenet -> c.d.o.misc -> Re: SQL Help
On Jul 11, 4:17 pm, DA Morgan <damor..._at_psoug.org> wrote:
> Just for fun:
>
> explain plan for
> SELECT T.TASK_ID, T.TASK_CODE
> FROM TASK T, ACTV_CODE AC, (
> SELECT DISTINCT TASK_ID FROM ACTV_CODE
> WHERE CODE='Outage Code') ACN
> WHERE
> T.TASK_ID=ACN.TASK_ID(+)
> AND ACN.TASK_ID IS NULL
> AND T.TASK_ID=AC.TASK_ID
> AND AC.SHORT_NAME LIKE '%FIN';
>
> ----------------------------------------------------------------------------------
> | Id | Operation | Name | Rows | Bytes | Cost (%CPU)|
> Time |
> ----------------------------------------------------------------------------------
> | 0 | SELECT STATEMENT | | 2 | 106 | 11 (19)|
> 00:00:01 |
> |* 1 | HASH JOIN ANTI | | 2 | 106 | 11 (19)|
> 00:00:01 |
> |* 2 | HASH JOIN | | 4 | 160 | 7 (15)|
> 00:00:01 |
> |* 3 | TABLE ACCESS FULL | ACTV_CODE | 4 | 80 | 3 (0)|
> 00:00:01 |
> | 4 | TABLE ACCESS FULL | TASK | 8 | 160 | 3 (0)|
> 00:00:01 |
> | 5 | VIEW | | 4 | 52 | 4 (25)|
> 00:00:01 |
>
> | 6 | HASH UNIQUE | | 4 | 100 | 4 (25)|
> 00:00:01 |
> |* 7 | TABLE ACCESS FULL| ACTV_CODE | 4 | 100 | 3 (0)|
> 00:00:01 |
> ----------------------------------------------------------------------------------
>
> select task_id
> from actv_code a
> where short_name like '%FIN'
> and code = 'Lead Craft'
> and not exists (select null from actv_code b where b.task_id =
> a.task_id and b.code = 'Outage Code');
>
> --------------------------------------------------------------------------------
> | Id | Operation | Name | Rows | Bytes | Cost (%CPU)|
> Time |
> --------------------------------------------------------------------------------
> | 0 | SELECT STATEMENT | | 1 | 57 | 7 (15)|
> 00:00:01 |
> |* 1 | HASH JOIN ANTI | | 1 | 57 | 7 (15)|
> 00:00:01 |
> |* 2 | TABLE ACCESS FULL| ACTV_CODE | 4 | 128 | 3 (0)|
> 00:00:01 |
> |* 3 | TABLE ACCESS FULL| ACTV_CODE | 4 | 100 | 3 (0)|
> 00:00:01 |
> --------------------------------------------------------------------------------
>
> Though the result sets are not exactly the same.
> --
> Daniel A. Morgan
> University of Washington
> damor..._at_x.washington.edu (replace x with u to respond)
> Puget Sound Oracle Users Groupwww.psoug.org
It would be interesting to see how the different solutions perform as additional data is added - I suspect that Michel Cadot's solution will be the most efficient, even after his SQL statement is modified to retrieve the extra TASK_CODE column that the OP indicated in the desired result set. A re-test after modifying the tables so that TAS_ID cannot be null:
ALTER TABLE TASK MODIFY (
TASK_ID NOT NULL);
ALTER TABLE ACTV_CODE MODIFY (
TASK_ID NOT NULL);
SELECT /*+ GATHER_PLAN_STATISTICS */
T.TASK_ID,
T.TASK_CODE
FROM
TASK T,
ACTV_CODE AC,
(SELECT DISTINCT
TASK_ID
FROM
ACTV_CODE
WHERE
CODE='Outage Code') ACN
WHERE
T.TASK_ID=ACN.TASK_ID(+)
AND ACN.TASK_ID IS NULL
AND T.TASK_ID=AC.TASK_ID
AND AC.SHORT_NAME LIKE '%FIN';
|* 3 | TABLE ACCESS FULL | ACTV_CODE | 1 | 4 | 4 |00:00:00.01 | 7 | | | | | 4 | TABLE ACCESS FULL | TASK | 1 | 8 | 8 |00:00:00.01 | 7 | | | | | 5 | VIEW | | 1 | 4 | 4 |00:00:00.01 | 7 | | | | | 6 | HASH UNIQUE | | 1 | 4 | 4 |00:00:00.01 | 7 | | | | |* 7 | TABLE ACCESS FULL| ACTV_CODE | 1 | 4 | 4 |00:00:00.01 | 7 | | | | -----------------------------------------------------------------------------------------------------------------------
SELECT /*+ GATHER_PLAN_STATISTICS */
T.TASK_ID,
T.TASK_CODE
FROM
TASK T,
ACTV_CODE AC,
(SELECT
TASK_ID
FROM
ACTV_CODE
WHERE
CODE='Outage Code') ACN
WHERE
T.TASK_ID=ACN.TASK_ID(+)
AND ACN.TASK_ID IS NULL
AND T.TASK_ID=AC.TASK_ID
AND AC.SHORT_NAME LIKE '%FIN';
|* 3 | TABLE ACCESS FULL| ACTV_CODE | 1 | 4 | 4 |00:00:00.01 | 7 | | | | | 4 | TABLE ACCESS FULL| TASK | 1 | 8 | 8 |00:00:00.01 | 7 | | | | | 5 | VIEW | | 1 | 4 | 4 |00:00:00.01 | 7 | | | | |* 6 | TABLE ACCESS FULL| ACTV_CODE | 1 | 4 | 4 |00:00:00.01 | 7 | | | | ---------------------------------------------------------------------------------------------------------------------- select /*+ GATHER_PLAN_STATISTICS */ t.task_id, t.task_code from actv_code a, task t
and a.code = 'Lead Craft'
and a.task_id=t.task_id
and not exists (select null from actv_code b where b.task_id =
a.task_id and b.code = 'Outage Code');
|* 3 | TABLE ACCESS FULL| ACTV_CODE | 1 | 4 | 4 |00:00:00.01 | 7 | | | | |* 4 | TABLE ACCESS FULL| ACTV_CODE | 1 | 4 | 4 |00:00:00.01 | 7 | | | | | 5 | TABLE ACCESS FULL | TASK | 1 | 8 | 8 |00:00:00.01 | 7 | | | | ----------------------------------------------------------------------------------------------------------------------
SELECT /*+ GATHER_PLAN_STATISTICS */
Not requested, but just for entertainment: select /*+ GATHER_PLAN_STATISTICS */
t.task_id, t.task_code from actv_code a, task t
and a.code = 'Lead Craft' and a.task_id=t.task_id and a.task_id not in (select b.task_id from actv_code b whereb.task_id =
|* 3 | TABLE ACCESS FULL| ACTV_CODE | 1 | 4 | 4 |00:00:00.01 | 7 | | | | |* 4 | TABLE ACCESS FULL| ACTV_CODE | 1 | 4 | 4 |00:00:00.01 | 7 | | | | | 5 | TABLE ACCESS FULL | TASK | 1 | 8 | 8 |00:00:00.01 | 7 | | | | ----------------------------------------------------------------------------------------------------------------------
Without help from Oracle 10.2.0.2's transformations: select /*+ GATHER_PLAN_STATISTICS NO_QUERY_TRANSFORMATION */
t.task_id, t.task_code from actv_code a, task t
and a.code = 'Lead Craft' and a.task_id=t.task_id and a.task_id not in (select b.task_id from actv_code b whereb.task_id =
|* 1 | FILTER | | 1 | | 2 |00:00:00.01 | 34 | | | | |* 2 | HASH JOIN | | 1 | 4 | 4 |00:00:00.01 | 14 | 1066K| 1066K| 646K (0)| |* 3 | TABLE ACCESS FULL| ACTV_CODE | 1 | 4 | 4 |00:00:00.01 | 7 | | | | | 4 | TABLE ACCESS FULL| TASK | 1 | 8 | 8 |00:00:00.01 | 7 | | | | |* 5 | TABLE ACCESS FULL | ACTV_CODE | 4 | 1 | 2 |00:00:00.01 | 20 | | | | ----------------------------------------------------------------------------------------------------------------------
Charles Hooper
IT Manager/Oracle DBA
K&M Machine-Fabricating, Inc.
Received on Wed Jul 11 2007 - 16:03:13 CDT
![]() |
![]() |