Re: outer join between parent-child, not null and FK constraints
Date: Fri, 25 Jan 2013 17:42:12 -0600
Message-ID: <CAO4+9HUnb7QtUnzDx_ESjWqgujSg4PdaJ-=fv83tqxvPLFFL6A_at_mail.gmail.com>
Without Any constraints
TARAL.TARALWIN>select emp.ename, dept.dname from emp, dept where emp.deptno=dept.deptno(+)
ENAME DNAME
---------- --------------
MILLER ACCOUNTING KING ACCOUNTING CLARK ACCOUNTING FORD RESEARCH ADAMS RESEARCH SCOTT RESEARCH JONES RESEARCH SMITH RESEARCH JAMES SALES TURNER SALES BLAKE SALES MARTIN SALES WARD SALES ALLEN SALES -------------------------------------------------------------------------------------------------------| OMem | 1Mem | Used-Mem |
| Id | Operation | Name | E-Rows |E-Bytes| Cost (%CPU)| E-Time
| 0 | SELECT STATEMENT | | | | 7 (100)|
| | | | |* 1 | HASH JOIN OUTER | | 14 | 588 | 7 (15)| 00:00:01Predicate Information (identified by operation id):
| 921K| 921K| 582K (0)|
| 2 | TABLE ACCESS FULL| EMP | 14 | 280 | 3 (0)| 00:00:01
| | | |
| 3 | TABLE ACCESS FULL| DEPT | 4 | 88 | 3 (0)| 00:00:01
| | | |
-------------------------------------------------------------------------------------------------------
1 - access("EMP"."DEPTNO"="DEPT"."DEPTNO")
Adding constraints
TARAL.TARALWIN>alter table dept add constraint d_pk primary key(deptno);
Table altered.
TARAL.TARALWIN>alter table emp add constraint e_pk primary key(empno);
Table altered.
TARAL.TARALWIN>alter table emp add constraint e_fk_d foreign key(deptno) references dept(deptno);
Table altered.
| Id | Operation | Name | E-Rows |E-Bytes| Cost (%CPU)| E-Time
| OMem | 1Mem | Used-Mem |
| 0 | SELECT STATEMENT | | | | 7 (100)|
| | | | |* 1 | HASH JOIN OUTER | | 14 | 588 | 7 (15)| 00:00:01
| 921K| 921K| 580K (0)|
| 2 | TABLE ACCESS FULL| EMP | 14 | 280 | 3 (0)| 00:00:01
| | | |
| 3 | TABLE ACCESS FULL| DEPT | 4 | 88 | 3 (0)| 00:00:01
| | | |
-------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
1 - access("EMP"."DEPTNO"="DEPT"."DEPTNO")
As, you can see it need to visit DEPT to get that dname otherwise there is JE
select emp.ename from emp, dept where emp.deptno=dept.deptno(+)
Plan hash value: 3956160932
| Id | Operation | Name | E-Rows |E-Bytes| Cost (%CPU)| E-Time |
| 0 | SELECT STATEMENT | | | | 3 (100)| |
| 1 | TABLE ACCESS FULL| EMP | 14 | 98 | 3 (0)| 00:00:01 |
On Thu, Jan 24, 2013 at 3:06 PM, amonte <ax.mount_at_gmail.com> wrote:
> Hello all > As a simple example we will use tables emp and dept (the demo tables) who > have a parent child relationship, if we make emp.deptno NOT NULL and we run > this query > > select ename, dname from emp, dept > where emp.deptno = dept.deptno(+) > > shouldnt Oracle be clever enough know that the outer join is redundant? > > The explain plan shows: > --------------------------------------------------------------------------- > | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | > --------------------------------------------------------------------------- > | 0 | SELECT STATEMENT | | 14 | 588 | 7 (15)| 00:00:01 | > |* 1 | HASH JOIN OUTER | | 14 | 588 | 7 (15)| 00:00:01 | > | 2 | TABLE ACCESS FULL| EMP | 14 | 280 | 3 (0)| 00:00:01 | > | 3 | TABLE ACCESS FULL| DEPT | 4 | 88 | 3 (0)| 00:00:01 | > --------------------------------------------------------------------------- > > Predicate Information (identified by operation id): > --------------------------------------------------- > > 1 - access("EMP"."DEPTNO"="DEPT"."DEPTNO"(+)) > > > emp can never return rows which doesnt have a match in dept so outer join > seems redundant with the constraints info? > > > Alex > > > -- > http://www.freelists.org/webpage/oracle-l > > >
-- Thanks & Regards, Taral Desai -- http://www.freelists.org/webpage/oracle-lReceived on Sat Jan 26 2013 - 00:42:12 CET