Presentation is loading. Please wait.

Presentation is loading. Please wait.

Oracle12c Join Techniques

Similar presentations


Presentation on theme: "Oracle12c Join Techniques"— Presentation transcript:

1 Oracle12c Join Techniques
Carl Dudley Tradba Ltd Oracle ACE Director

2 Introduction Working with Oracle since 1986
Oracle DBA - OCP Oracle7, 8, 9, 10 Oracle DBA of the Year – 2002 Oracle ACE Director Beta tester – Oracle8, 9, 10, 11, 12 Regular Presenter at Oracle Conferences Consultant and Trainer Technical Editor for a number of Oracle texts UK Oracle User Group Official Member of IOUC Fellow of British Computer Society ANSI and Oracle Joins Two-way Outer Joins Join and Filter Conditions Chaining on the Outer Join Hash Join Trees Anti Joins and Semi Joins Lateral Joins Nested Loops Joins Join Elimination Adaptive Joins

3 The emp and dept Tables dept emp DEPTNO DNAME LOC
10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON emp EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO 7934 MILLER CLERK JAN 7782 CLARK MANAGER JUN 7839 KING PRESIDENT NOV 7369 SMITH CLERK DEC 7876 ADAMS CLERK JAN 7566 JONES MANAGER APR 7902 FORD ANALYST DEC 7788 SCOTT ANALYST DEC 7900 JAMES CLERK DEC 7521 WARD SALESMAN FEB 7654 MARTIN SALESMAN SEP 7844 TURNER SALESMAN SEP 7499 ALLEN SALESMAN FEB 7698 BLAKE MANAGER MAY

4 ANSI Joins ANSI defined join syntax in ANSI SQL2 Standard (1992)
Oracle finally fully implemented this syntax in Oracle9i Types of joins specified by additional keywords INNER JOIN OUTER JOIN (LEFT RIGHT FULL) CROSS JOIN UNION JOIN (not supported by Oracle)

5 Inner Joins – ANSI and Oracle Syntax
Equivalent ANSI – based joins SELECT ename,dname,dept.deptno FROM emp JOIN dept ON dept.deptno = emp.deptno; SELECT ename,dname,deptno FROM emp NATURAL JOIN dept; SELECT ename,dname,deptno FROM emp NATURAL JOIN dept USING (deptno); Note the absence of the table qualifier for deptno in some of the examples Equivalent Oracle join SELECT ename,dname,dept.deptno FROM emp,dept WHERE emp.deptno = dept.deptno;

6 The Join Condition Join condition (ON clause) must be included
Helps safeguard against inadvertant cartesian products SELECT ename,dname,dept.deptno FROM emp JOIN dept; ORA-00905: missing keyword But join condition does not have to make any sense Could cause cartesian products Oracle join syntax has no protection SELECT ename,dname,dept.deptno FROM emp JOIN dept ON emp.empno = emp.empno;

7 Multi-table Joins If several tables are to be joined
Use a step-wise process by first joining two of the tables Then add a further JOIN keyword to join to the third table Repeat this for each subsequent table Each join may have its own condition(s) The joins may be of different types SELECT emp.empno ,emp.ename ,dept.loc ,proj.pname FROM emp JOIN dept ON emp.deptno = dept.deptno JOIN proj ON emp.proj_id = proj.proj_id;

8 LEFT and RIGHT Outer Joins
The driving table is specified with LEFT or RIGHT This table will have all its rows included Dummy NULL rows may be included from the other table Refers to placement of the table name WITHIN the FROM ... JOIN clause The following join clauses are all equivalent FROM emp,dept WHERE emp.deptno(+) = dept.deptno FROM dept LEFT OUTER JOIN emp ON emp.deptno = dept.deptno FROM emp RIGHT OUTER JOIN dept

9 Modified Employee Data
empa EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO 7782 CLARK MANAGER JUN 7788 SCOTT ANALYST APR 7844 TURNER SALESMAN SEP 7499 ALLEN SAlESMAN FEB 7902 FORD ANALYST DEC 1111 EXTRA CEO JAN dept DEPTNO DNAME LOC 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON

10 RIGHT Outer Joins SELECT ename,dname,dept.deptno
FROM empa RIGHT OUTER JOIN dept ON empa.deptno = dept.deptno; ENAME DNAME DEPTNO CLARK ACCOUNTING SCOTT RESEARCH TURNER SALES FORD RESEARCH ALLEN SALES OPERATIONS Equivalent Oracle join statement SELECT ename,dname,dept.deptno FROM empa,dept WHERE dept.deptno = emp.deptno(+);

11 LEFT Outer Joins SELECT ename,dname,dept.deptno
FROM empa LEFT OUTER JOIN dept ON empa.deptno = dept.deptno; ENAME DNAME DEPTNO CLARK ACCOUNTING SCOTT RESEARCH TURNER SALES FORD RESEARCH ALLEN SALES EXTRA Equivalent Oracle join statement SELECT ename,dname,dept.deptno FROM empa, dept WHERE dept.deptno(+) = empa.deptno;

12 FULL Outer Joins SELECT ename,dname,dept.deptno d_deptno, empa.deptno e_deptno FROM empa FULL OUTER JOIN dept ON empa.deptno = dept.deptno; ENAME DNAME D_DEPTNO E_DEPTNO CLARK ACCOUNTING SCOTT RESEARCH TURNER SALES FORD RESEARCH ALLEN SALES EXTRA OPERATIONS All rows included from both tables Equivalent (ILLEGAL) Oracle join statement SELECT ename,dname,dept.deptno,empa.deptno FROM empa, dept WHERE dept.deptno(+) = empa.deptno(+);

13 FULL OUTER JOIN – Oracle11g
Oracle now performs a 'NATIVE' full outer join SELECT ename ,dname FROM empa e FULL OUTER JOIN dept d ON e.deptno = d.deptno; | Id | Operation | Name |Rows |Bytes |Cost(%CPU | 0| SELECT STATEMENT | | 15 | 240 | 7 (15 | 1| VIEW | VW_FOJ_0 | 15 | 240 | 7 (15 |* 2| HASH JOIN FULL OUTER| | 15 | 330 | 7 (15 | 3| TABLE ACCESS FULL | DEPT | 4 | 52 | 3 (0 | 4| TABLE ACCESS FULL | EMPA | 14 | 126 | 3 (0

14 FULL OUTER JOIN – Oracle10g
ALTER SESSION SET optimizer_features_enable = ' '; SELECT ename ,dname FROM empa e FULL OUTER JOIN dept d ON e.deptno = d.deptno; | Id | Operation | Name | Rows | Bytes | Cost | | 0 | SELECT STATEMENT | | | | 13| | 1 | VIEW | | | | 13| | 2 | UNION-ALL | | | | | |* 3 | HASH JOIN OUTER | | | | 7| | 4 | TABLE ACCESS FULL| EMPA | | | 3| | 5 | TABLE ACCESS FULL| DEPT | | | 3| |* 6 | HASH JOIN ANTI | | | | 7| | 7 | TABLE ACCESS FULL| DEPT | | | 3| | 8 | TABLE ACCESS FULL| EMPA | | | 3|

15 FULL OUTER JOIN – Oracle10g (continued)
Statement is transformed to a UNION construct Generates same execution plan as for 10g FULL OUTER JOIN Native full outer join available in and with a hint /*+NATIVE_FULL_OUTER_JOIN */ Undocumented parameter _optimizer_native_full_outer_join SELECT ename ,dname FROM empa e ,dept d WHERE e.deptno = d.deptno(+) UNION ALL SELECT null FROM dept d2 WHERE NOT EXISTS (SELECT 'x' FROM empa e2 WHERE e2.deptno = d2.deptno);

16 Oracle12c Join Techniques
ANSI and Oracle Joins Two-way Outer Joins Join and Filter Conditions Chaining on the Outer Join Hash Join Trees Anti Joins and Semi Joins Lateral Joins Nested Loops Joins Join Elimination Adaptive Joins

17 Two-way Outer Joins empb dept proj
project table linked to a cut down modified version of emp, called empb Project number 3 (DESIGN) has no employees empb EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO PROJ_ID 7782 CLARK MANAGER JUN 7788 SCOTT ANALYST APR 7844 TURNER SALESMAN SEP 7499 ALLEN SAlESMAN FEB proj dept DEPTNO DNAME LOC 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON PROJ_ID PNAME START_DATE 1 BPR JUL-2002 2 MIGRATION 12-OCT-2002 3 DESIGN NOV-2002

18 Two-way Outer Joins (+) (+)
Show details of employees with their projects and departments Include projects with no employees and departments with no employees project empb dept (+) (+)

19 ANSI Two-way Outer Joins – Expected result
Two-way outer joins are allowed but the result may not be as expected Outer join of empb to both dept and project based on deptno and proj_id values (as requested on the previous slide) should give the following result ENAME HIREDATE DEPTNO DNAME PROJ_ID PNAME ALLEN FEB SALES BPR TURNER SEP SALES BPR CLARK JUN ACCOUNTING BPR SCOTT APR RESEARCH MIGRATION 40 OPERATIONS 3 DESIGN

20 ANSI Two-way Outer Joins – Missing Rows
Unexpected results? SELECT ename, hiredate,d.deptno,dname,p.proj_id,pname FROM dept d LEFT OUTER JOIN empb e ON e.deptno = d.deptno RIGHT OUTER JOIN proj p ON e.proj_id = p.proj_id; ENAME HIREDATE DEPTNO DNAME PROJ_ID PNAME CLARK JUN ACCOUNTING BPR SCOTT APR RESEARCH MIGRATION ALLEN FEB SALES BPR TURNER SEP SALES BPR 3 DESIGN

21 ANSI Two-way Outer Joins – Missing Rows (continued)
Reordering the joins still gives another different unexpected result? Outer joins are not 'symmetrical' SELECT ename, hiredate,d.deptno,dname,p.proj_id,pname FROM proj p LEFT OUTER JOIN empb e ON e.proj_id = p.proj_id RIGHT OUTER JOIN dept d ON e.deptno = d.deptno; ENAME HIREDATE DEPTNO DNAME PROJ_ID PNAME CLARK JUN ACCOUNTING BPR SCOTT APR RESEARCH MIGRATION TURNER SEP SALES BPR ALLEN FEB SALES BPR 40 OPERATIONS

22 ANSI Two-way Outer Joins - Explanation
Explanation of unexpected behaviour Examine the result of the first join in the first example The fifth row does not have a value in the proj_id column This row can not take part in the final join with the proj table SELECT ename, hiredate,d.deptno,dname,proj_id FROM dept d LEFT OUTER JOIN empb e ON e.deptno = d.deptno; ENAME HIREDATE DEPTNO DNAME PROJ_ID CLARK JUN ACCOUNTING SCOTT APR RESEARCH TURNER SEP SALES ALLEN FEB SALES 40 OPERATIONS

23 ANSI Two-way Outer Joins – use of FULL
Outer joining dept to empb gives a row with NULL in proj_id This row can not take part in the second outer join The second join needs to be a FULL OUTER JOIN SELECT ename,hiredate,d.deptno,dname,p.proj_id,pname FROM dept d LEFT OUTER JOIN empb e ON e.deptno = d.deptno FULL OUTER JOIN proj p ON e.proj_id = p.proj_id; ENAME HIREDATE DEPTNO DNAME PROJ_ID PNAME ALLEN FEB SALES BPR TURNER SEP SALES BPR CLARK JUN ACCOUNTING BPR SCOTT APR RESEARCH MIGRATION 40 OPERATIONS 3 DESIGN SELECT STATEMENT | VIEW | VW_FOJ_0 HASH JOIN FULL OUTER| TABLE ACCESS FULL | PROJ VIEW | HASH JOIN OUTER | TABLE ACCESS FULL| DEPT TABLE ACCESS FULL| EMPB

24 Two-way Outer Joins – Oracle Style
In 11g, Oracle syntax cannot outer join a table to more than one other table SELECT ename,hiredate,d.deptno,dname,p.proj_id,pname FROM dept d, empb e, proj p WHERE e.deptno(+) = d.deptno AND e.proj_id(+) = p.proj_id; ORA-01417: a table may be outer joined to at most one other table

25 Two-way Outer Joins – Oracle Style (continued)
But in Oracle12c, this would be the output Can be imitated using ANSI syntax ENAME HIREDATE DEPTNO DNAME PROJ_ID PNAME SCOTT APR RESEARCH MIGRATION ALLEN FEB SALES BPR TURNER SEP SALES BPR CLARK JUN ACCOUNTING BPR 40 OPERATIONS BPR 40 OPERATIONS MIGRATION 40 OPERATIONS DESIGN 30 SALES MIGRATION 30 SALES DESIGN 20 RESEARCH BPR 20 RESEARCH DESIGN 10 ACCOUNTING MIGRATION 10 ACCOUNTING DESIGN SELECT ename,hiredate,d.deptno,dname,p.proj_id,pname FROM dept d CROSS JOIN proj p LEFT OUTER JOIN empb e ON e.deptno = d.deptno AND e.proj_id = p.proj_id SELECT STATEMENT | HASH JOIN OUTER | MERGE JOIN CARTESIAN| TABLE ACCESS FULL | PROJ BUFFER SORT | TABLE ACCESS FULL | DEPT TABLE ACCESS FULL | EMPB

26 Oracle Outer Joins with Subqueries
Show each department with its longest serving employee Subqueries are not allowed in combination with an outer join condition SELECT ename, hiredate,d.deptno,dname FROM dept d LEFT OUTER JOIN emp e ON e.deptno = d.deptno AND e.hiredate = (SELECT MIN(e.hiredate) FROM emp e WHERE e.deptno = d.deptno); SELECT ename, hiredate,d.deptno,dname FROM dept d, empa e WHERE e.deptno(+) = d.deptno AND e.hiredate(+) = (SELECT MIN(e.hiredate) FROM empa e WHERE e.deptno = d.deptno); ENAME HIREDATE DEPTNO DNAME CLARK JUN ACCOUNTING SMITH DEC RESEARCH ALLEN FEB SALES 40 OPERATIONS ORA-01799: a column may not be outer-joined to a subquery What about ANSI joins?

27 Oracle12c Join Techniques
ANSI and Oracle Joins Two-way Outer Joins Join and Filter Conditions Chaining on the Outer Join Hash Join Trees Anti Joins and Semi Joins Lateral Joins Nested Loops Joins Join Elimination Adaptive Joins

28 Join and Filter Conditions
Oracle uses the ON clause for join conditions Conditions specified in a WHERE clause are treated as filter conditions Filter conditions can also be specified in the ON (or USING) clause Join operations and conditions are effectively processed before the WHERE clause conditions

29 Oracle Join and Filter Conditions
SELECT dept.deptno,dname,ename,job FROM dept, empa WHERE empa.deptno(+) = dept.deptno AND empa.job = 'SALESMAN'; DEPTNO DNAME ENAME JOB 30 SALES TURNER SALESMAN 30 SALES ALLEN SALESMAN Filter applied after the join SELECT dept.deptno,dname,ename,job FROM dept, empa WHERE empa.deptno(+) = dept.deptno AND empa.job(+) = 'SALESMAN'; DEPTNO DNAME ENAME JOB 10 ACCOUNTING 20 RESEARCH 30 SALES TURNER SALESMAN 30 SALES ALLEN SALESMAN 40 OPERATIONS Filter applied during the join Somewhat awkward syntax

30 ANSI Join and Filter Conditions
SELECT dept.deptno,dname,ename,job FROM dept LEFT OUTER JOIN empa ON empa.deptno = dept.deptno WHERE empa.job = 'SALESMAN‘; DEPTNO DNAME ENAME JOB 30 SALES ALLEN SALESMAN 30 SALES TURNER SALESMAN Filter applied after the join Easier to understand due to separation of join conditions from filter conditions SELECT dept.deptno,dname,ename,job FROM dept LEFT OUTER JOIN empa ON empa.deptno = dept.deptno AND empa.job = 'SALESMAN'; DEPTNO DNAME ENAME JOB 30 SALES TURNER SALESMAN 30 SALES ALLEN SALESMAN 40 OPERATIONS 20 RESEARCH 10 ACCOUNTING Filter applied during the join Note the three outer joined rows - one row for each department having no salesmen

31 Oracle Outer Joins and OR
Oracle syntax cannot cope SELECT dname ,ename ,job ,loc ,sal FROM emp e ,dept d WHERE e.deptno(+) = d.deptno AND (sal(+) > 2999 OR loc(+) = ‘NEW YORK') ORDER BY dname; AND (sal(+) > 2999 OR loc(+) = ‘NEW YORK') ERROR : ORA-01719:outer join operator (+) not allowed in operand of OR or IN

32 ANSI Outer Joins and OR ANSI join can process OR when combined with outer join SELECT dname ,ename ,job ,loc ,sal FROM emp e RIGHT OUTER JOIN dept d ON e.deptno = d.deptno AND (sal > 2999 OR loc = 'NEW YORK') ORDER BY dname; DNAME ENAME JOB LOC SAL ACCOUNTING CLARK MANAGER NEW YORK ACCOUNTING KING PRESIDENT NEW YORK ACCOUNTING MILLER CLERK NEW YORK OPERATIONS BOSTON RESEARCH FORD ANALYST DALLAS RESEARCH SCOTT ANALYST DALLAS SALES CHICAGO

33 Oracle12c Join Techniques
ANSI and Oracle Joins Two-way Outer Joins Join and Filter Conditions Chaining on the Outer Join Hash Join Trees Anti Joins and Semi Joins Lateral Joins Nested Loops Joins Join Elimination Adaptive Joins

34 'Chaining on' the Outer Join
course attendance student All courses have attendances, all attendances have offerings Hence outer join is never necessary when joining offering and attendance Some students do not have attendances Query : Show ALL students along with their courses

35 Data in the Sample Tables
student course STUDENT_ID STUDENT_LNAME 1111 BROWN 2299 ADAMS 4568 COX 5556 TYLER 6789 ROSE COURSE_ID START_DATE DEC-11 JUL-12 NOV-12 attendance COURSE_ID STUDENT_ID Two students do not have any attendances All courses and attendances are related Outer join between these tables should NOT be needed

36 Joining course and attendance
SELECT c.course_id c_course_id ,a.course_id a_course_id ,a.student_id FROM course c INNER JOIN attendance a ON c.course_id = a.course_id; SELECT o.course_id c_course_id ,a.course_id a_course_id ,a.student_id a_student_id FROM attendance a LEFT OUTER JOIN course c ON a.course_id = c.course_id; Exact same result C_COURSE_ID A_COURSE_ID A_STUDENT_ID Outer join is completely unnecessary as all rows match

37 Joining attendance and student
Outer join is necessary to include students without attendances SELECT s.student_id s_student_id ,s.student_lname s_student_lname ,a.student_id a_student_id ,a.course_id a_course_id FROM student s LEFT OUTER JOIN attendance a ON s.student_id = a.student_id; S_STUDENT_ID S_LNAME A_STUDENT_ID A_COURSE_ID 1111 BROWN 2299 ADAMS 2299 ADAMS 6789 ROSE 1111 BROWN 4568 COX 5556 TYLER

38 Join the Three Tables - inner join 'loses' students
SELECT s.student_id s_student_id,s.student_lname s_lname ,a.student_id a_student_id,a.course_id a_course_id ,c.course_id c_course_id,c.start_date FROM student s LEFT OUTER JOIN attendance a ON s.student_id = a.student_id INNER JOIN course c ON c.course_id = a.course_id; S_STUDENT_ID S_LNAME A_STUDENT_ID A_COURSE_ID C_COURSE_ID START_DATE 1111 BROWN DEC-11 2299 ADAMS JUL-12 2299 ADAMS NOV-12 6789 ROSE JUL-12 1111 BROWN NOV-12 | Id | Operation | Name |Rows | | 0| SELECT STATEMENT | | 5| |* 1| HASH JOIN | | 5| |* 2| HASH JOIN | | 5| | 3| TABLE ACCESS FULL| COURSE | 3| | 4| TABLE ACCESS FULL| ATTENDANCE | 5| | 5| TABLE ACCESS FULL | STUDENT | 5| Rows are lost by the final inner join Oracle is smart enough not to perform the outer join

39 Chaining on the OUTER JOIN
SELECT s.student_id s_student_id,s.student_lname s_lname ,a.student_id a_student_id,a.course_id a_course_id ,c.course_id c_course_id,c.start_date FROM student s LEFT OUTER JOIN attendance a ON s.student_id = a.student_id LEFT OUTER JOIN course c ON c.course_id = a.course_id; S_STUDENT_ID S_LNAME A_STUDENT_ID A_COURSE_ID C_COURSE_ID START_DATE 1111 BROWN DEC-11 2299 ADAMS JUL-12 2299 ADAMS NOV-12 6789 ROSE JUL-12 1111 BROWN NOV-12 4568 COX 5556 TYLER | Id | Operation | Name |Rows | | 0| SELECT STATEMENT | | 5| |* 1| HASH JOIN OUTER | | 5| |* 2| HASH JOIN OUTER | | 5| | 3| TABLE ACCESS FULL| STUDENT | 5| | 4| TABLE ACCESS FULL| ATTENDANCE | 5| | 5| TABLE ACCESS FULL | COURSE | 3| Outer join must be performed between attendance and course when not strictly necessary

40 Avoiding the second OUTER JOIN
SELECT s.student_id s_student_id,s.student_lname s_lname ,a.student_id a_student_id,a.course_id a_course_id ,c.course_id c_course_id,c.start_date FROM course c JOIN attendance a ON c.course_id = a.course_id RIGHT OUTER JOIN student s ON s.student_id = a.student_id; S_STUDENT_ID S_LNAME A_STUDENT_ID A_COURSE_ID C_COURSE_ID START_DATE 1111 BROWN DEC-11 2299 ADAMS JUL-12 2299 ADAMS NOV-12 6789 ROSE JUL-12 1111 BROWN NOV-12 4568 COX 5556 TYLER | Id | Operation | Name |Rows | | 0| SELECT STATEMENT | | 5| |* 1| HASH JOIN OUTER | | 5| | 2| TABLE ACCESS FULL | STUDENT | 5| | 3| VIEW | | 5| |* 4| HASH JOIN | | 5| | 5| TABLE ACCESS FULL| COURSE | 3| | 6| TABLE ACCESS FULL| ATTENDANCE | 5| Inner join performed first Outer join preserves all student rows

41 Ordering the joins 'Right'
SELECT s.student_id s_student_id,s.student_lname s_lname ,a.student_id a_student_id,a.course_id a_course_id ,c.course_id c_course_id,c.start_date FROM attendance a RIGHT OUTER JOIN student s ON s.student_id = a.student_id JOIN course c ON c.course_id = a.course_id; S_STUDENT_ID S_LNAME A_STUDENT_ID A_COURSE_ID C_COURSE_ID START_DATE 1111 BROWN DEC-11 2299 ADAMS JUL-12 2299 ADAMS NOV-12 6789 ROSE JUL-12 1111 BROWN NOV-12 Right join would be performed first? Inner join would then lose the outer joined student rows No outer joins performed | Id | Operation | Name |Rows | | 0| SELECT STATEMENT | | 5| |* 1 HASH JOIN | | 5| |* 2| HASH JOIN | | 5| | 3| TABLE ACCESS FULL| COURSE | 3| | 4| TABLE ACCESS FULL| ATTENDANCE | 5| | 5| TABLE ACCESS FULL | STUDENT | 5|

42 Oracle12c Join Techniques
ANSI and Oracle Joins Two-way Outer Joins Join and Filter Conditions Chaining on the Outer Join Hash Join Trees Anti Joins and Semi Joins Lateral Joins Nested Loops Joins Join Elimination Adaptive Joins

43 Processing a Hash Join Build Table (customers) Hash table
NAME CITY ... SCOTT BATH PAYNE YORK FOX LEEDS SMITH ELY WOOD ADAMS LONDON Hash table ADAMS LONDON ... FOX LEEDS PAYNE YORK SCOTT BATH WOOD SMITH ELY ... ORD_ID NAME ... 1 SMITH 2 PAYNE 3 FOX 4 SCOTT 5 WOOD 6 ADAMS Probe Table (orders)

44 Join Trees for T1 T2 T3 T4 Left deep tree T2 T1 T3 T4 Right deep tree
Hash table built on T3 probed by result of T1 join T2 built on T2 probed by T1 built on T4 of T1 join T2 join T3 Output of T1 join T2 join T3 probed by T4 T2 T1 T3 T4 Output of T1 join T2 probed by T3 Hash table built on T1 probed by T2

45 Summary of Left-deep and Right-deep Hash Join Trees
Result sets are formed before build of next hash table Workarea discarded after each subsequent join Only one workarea used Right-deep Hash tables on T3 and T4 can be built 'in parallel' with hash table on T1 Three workareas can be used Could be useful when the results of joins are larger than the two sets of rows being joined

46 Join Trees for T1 T2 T3 T4 (continued)
Zig-zag tree Bushy tree T1 T2 T3 T4

47 Tree Combinations Optimizer normally considers only left-deep trees (until latest release?) Left deep joins cover most requirements Number of left-deep trees = n! Total number of join trees = (2n-2)!/(n-1)! Tables Left-Deep Trees Bushy Trees (inc. Left and Right) 1 2 3 6 12 4 24 120 5 1,680 720 30,240 Can Oracle be forced to perform a bushy tree?

48 Four Table Join Scenario
sa ID NAME WA_ID 1 x 2 y 3 z : : : wa WA_ID WA_NAME 1 name1 2 name2 3 name3 : : p P_ID P_NAME WA_ID PT_ID 1 pname 2 pname 3 pname : : : : pt PT_ID PT_NAME 1 ptname1 2 ptname2 3 ptname3 : :

49 Right Deep Join Tree Oracle uses hints internally to force a right deep join in this case SELECT /*+GATHER_PLAN_STATISTICS */ name FROM sa JOIN wa ON wa.wa_id = sa.wa_id JOIN p ON wa.wa_id = p.wa_id JOIN pt ON pt.pt_id = p.pt_id; Internally generated hints | SELECT STATEMENT | | | HASH JOIN | | | TABLE ACCESS FULL | SA | | HASH JOIN | | | TABLE ACCESS FULL | WA | | HASH JOIN | | | TABLE ACCESS FULL| PT | | TABLE ACCESS FULL| P |

50 Left Deep Join Tree Left deep tree can be forced using hints
SELECT /*+GATHER_PLAN_STATISTICS no_swap_join_inputs(wa) no_swap_join_inputs(p) no_swap_join_inputs(pt) no_swap_join_inputs(sa)*/ name FROM sa JOIN wa ON wa.wa_id = sa.wa_id JOIN p ON wa.wa_id = p.wa_id JOIN pt ON pt.pt_id = p.pt_id; | SELECT STATEMENT | | | HASH JOIN | | | HASH JOIN | | | HASH JOIN | | | TABLE ACCESS FULL| PT | | TABLE ACCESS FULL| P | | TABLE ACCESS FULL | WA | | TABLE ACCESS FULL | SA |

51 Forcing a Bushy Tree In complex decision support scenarios a bushy tree can be a good plan Cannot be forced using '(', ')' or ORDERED, LEADING or other 'conventional' hints Must use inline views and a selection of less well known hints to stop Oracle merging the views internally SELECT /*+no_merge(v1) no_merge(v2)*/ name FROM (SELECT sa.name ,wa.wa_id FROM sa JOIN wa ON wa.wa_id = sa.wa_id) v1 JOIN (SELECT p.wa_id FROM p JOIN pt ON pt.pT_id = p.pT_id) v2 ON v1.wa_id = v2.wa_id; | SELECT STATEMENT | | | HASH JOIN | | | VIEW | | | HASH JOIN | | | TABLE ACCESS FULL| PT | | TABLE ACCESS FULL| P | | TABLE ACCESS FULL| WA | | TABLE ACCESS FULL| SA |

52 Oracle12c Join Techniques
ANSI and Oracle Joins Two-way Outer Joins Join and Filter Conditions Chaining on the Outer Join Hash Join Trees Anti Joins and Semi Joins Lateral Joins Nested Loops Joins Join Elimination Adaptive Joins

53 Hash Join Plans Semi-joins Often occur with EXISTS and IN subqueries
Used when existence tests are required Find departments which have employees Semi-join returns a department only once no matter how many employees work for it SELECT * FROM dept WHERE EXISTS (SELECT 'x' FROM emp WHERE deptno = dept.deptno);

54 Right Semi Join From Oracle 10g, the driving table can be automatically switched Can depend on size of input rowsets SWAP_JOIN_INPUTS hint is used internally Often used to avoid high memory usage (monitor OMEM with dbms_xplan) dept : 8192 rows emp : 7168 rows dept : 4 rows emp : 7168 rows |Operation |Name |Rows | |SELECT STATEMENT | |8192 | | HASH JOIN RIGHT SEMI| |8192 | | VIEW |VW_SQ_1|7168 | | TABLE ACCESS FULL |EMP |7168 | | TABLE ACCESS FULL |DEPT |8192 | |Operation |Name |Rows| |SELECT STATEMENT | | 4| | HASH JOIN SEMI | | 4| | TABLE ACCESS FULL |DEPT | 4| | VIEW |VW_SQ_1|7168| | TABLE ACCESS FULL|EMP |7168|

55 Departments with no Employees
SELECT * FROM dept WHERE deptno NOT IN (SELECT deptno FROM emp); SELECT * FROM dept x WHERE NOT EXISTS (SELECT 1 FROM emp y WHERE y.deptno = x.deptno); DEPTNO DNAME LOC 40 OPERATIONS BOSTON

56 No Index and no NOT NULL Constraint on emp.deptno
Oracle Version NOT IN plan NOT EXISTS plan 8i SELECT STATEMENT FILTER TABLE ACCESS FULL DEPT TABLE ACCESS FULL EMP 9i HASH JOIN ANTI 10g 11g HASH JOIN ANTI NA

57 NOT NULL constraint on emp.deptno
Oracle Version NOT IN plan NOT EXISTS plan 8i SELECT STATEMENT FILTER TABLE ACCESS FULL DEPT TABLE ACCESS FULL EMP 9i HASH JOIN ANTI 10g 11g HASH JOIN ANTI SNA

58 Index on emp.deptno, no NOT NULL constraint
Oracle Version NOT IN plan NOT EXISTS plan 8i SELECT STATEMENT FILTER TABLE ACCESS FULL DEPT TABLE ACCESS FULL EMP INDEX RANGE SCAN EMP$DEPTNO 9i 10g NESTED LOOPS ANTI 11g HASH JOIN ANTI NA HASH JOIN ANTI INDEX FAST FULL SCAN EMP$DEPTNO SELECT STATEMENT NESTED LOOPS ANTI TABLE ACCESS FULL DEPT INDEX RANGE SCAN EMP$DEPTNO 12c

59 Index and NOT NULL Constraint on emp.deptno
Version NOT IN plan NOT EXISTS plan 8i SELECT STATEMENT FILTER TABLE ACCESS FULL DEPT INDEX RANGE SCAN EMP$DEPTNO 9i INDEX FULL SCAN EMP$DEPTNO 10g NESTED LOOPS ANTI 11g HASH JOIN ANTI SNA If the column on the right hand side of the condition (emp.deptno) has no NOT NULL constraint, then NA is used If it is declared NOT NULL, SNA is used, along with an available index

60 Oracle12c Join Techniques
ANSI and Oracle Joins Two-way Outer Joins Join and Filter Conditions Chaining on the Outer Join Hash Join Trees Anti Joins and Semi Joins Lateral Joins Nested Loops Joins Join Elimination Adaptive Joins

61 Lateral Joins Inline views cannot reference columns outside of the view Considered to be out of scope SELECT dname ,ename FROM dept d ,(SELECT ename FROM emp e WHERE e.deptno = d.deptno); WHERE e.deptno = d.deptno) * ERROR : ORA-00904: "D"."DEPTNO": invalid identifier Lateral views allow such references Used internally Similar to correlated subqueries

62 Lateral Joins in Oracle12c
SELECT dname ,ename FROM dept d ,LATERAL(SELECT ename FROM emp e WHERE e.deptno = d.deptno); DNAME ENAME RESEARCH SMITH SALES ALLEN SALES WARD : : Identical execution plan to equivalent equi-join Need to set an event on Oracle11g LATERAL keyword can then be used to allow correlation ALTER SESSION SET EVENTS '22829 TRACE NAME CONTEXT FOREVER';

63 Lateral Outer Join Syntax – Oracle12c
SELECT dname ,ename ,job ,loc ,sal FROM dept ,LATERAL(SELECT ename,job,sal FROM emp WHERE emp.deptno = dept.deptno AND (sal < 1000 OR job = 'ANALYST'))(+); DNAME ENAME JOB LOC SAL ACCOUNTING NEW YORK RESEARCH SMITH CLERK DALLAS RESEARCH SCOTT ANALYST DALLAS RESEARCH FORD ANALYST DALLAS SALES JAMES CLERK CHICAGO OPERATIONS BOSTON

64 CROSS APPLY and OUTER APPLY
Attempts to solve compatibility issues with SQL Server migration tools SELECT dname,ename,job,loc,sal FROM dept CROSS APPLY (SELECT ename,job,sal FROM emp WHERE emp.deptno = dept.deptno AND (sal < 1000 OR job = 'ANALYST')) SELECT dname,ename,job,loc,sal FROM dept OUTER APPLY (SELECT ename,job,sal FROM emp WHERE emp.deptno = dept.deptno AND (sal < 1000 OR job = 'ANALYST'))

65 Equivalent Outer Join Plans
SELECT dname,ename,job,loc,sal FROM dept OUTER APPLY (SELECT ename,job,sal FROM emp WHERE emp.deptno = dept.deptno AND (sal < 1000 OR job = 'ANALYST')); SELECT dname,ename,job,loc,sal FROM dept ,LATERAL(SELECT ename,job,sal FROM emp WHERE emp.deptno = dept.deptno AND (sal < 1000 OR job = 'ANALYST'))(+); SELECT dname,ename,job,loc,sal FROM dept, emp WHERE emp.deptno(+) = dept.deptno AND (sal(+) < 1000 OR job(+) = 'ANALYST'); | Id | Operation | Name | Rows | | 0 | SELECT STATEMENT | | | |* 1 | HASH JOIN OUTER | | | | 2 | TABLE ACCESS FULL| DEPT | | |* 3 | TABLE ACCESS FULL| EMP | |

66 Use of CROSS/OUTER APPLY
When join sets are not known in advance Example purely for illustration : Number of emp rows to join is governed by highest salary in that department Note use of subquery in FETCH clause Can use any appropriate variable or expression SELECT deptno ,empno ,ename ,sal FROM dept OUTER APPLY (SELECT empno FROM emp WHERE emp.deptno = dept.deptno ORDER BY sal DESC FETCH FIRST (SELECT MAX(sal)/1500 WHERE emp.deptno = dept.deptno) ROWS ONLY) ORDER BY dept.deptno;

67 CROSS APPLY and OUTER APPLY with Table Level Functions
CREATE TYPE emp_row_type as OBJECT ( empno VARCHAR2(8), ename VARCHAR2(20), deptno VARCHAR2(20)); CREATE TYPE emp_table_type as TABLE OF emp_row_type; CREATE OR REPLACE FUNCTION get_all_emps(pi_deptno in number) RETURN emp_table_type PIPELINED AS BEGIN FOR cur IN (SELECT * FROM emp where deptno = pi_deptno) LOOP PIPE ROW(emp_row_type(cur.empno,cur.ename,cur.deptno)); END LOOP; RETURN; END;

68 Table Function Joins SELECT * FROM dept,
TABLE(get_all_emps(dept.deptno)); SELECT * FROM dept CROSS APPLY TABLE(get_all_emps(dept.deptno)); SELECT * FROM dept JOIN TABLE(get_all_emps(dept.deptno)) ON 1 = 1; DEPTNO DNAME LOC EMPNO ENAME DEPTNO 10 ACCOUNTING NEW YORK CLARK : : : : : : 20 RESEARCH DALLAS SMITH 30 SALES CHICAGO JAMES SELECT * FROM dept, TABLE(get_all_emps(dept.deptno))(+); SELECT * FROM dept OUTER APPLY TABLE(get_all_emps(dept.deptno)); SELECT * FROM dept LEFT OUTER JOIN TABLE(get_all_emps(dept.deptno)) ON NULL IS NULL; DEPTNO DNAME LOC EMPNO ENAME DEPTNO 10 ACCOUNTING NEW YORK CLARK : : : : : : 20 RESEARCH DALLAS SMITH 30 SALES CHICAGO JAMES 40 OPERATIONS BOSTON

69 Oracle12c Join Techniques
ANSI and Oracle Joins Two-way Outer Joins Join and Filter Conditions Chaining on the Outer Join Hash Join Trees Anti Joins and Semi Joins Lateral Joins Nested Loops Joins Join Elimination Adaptive Joins

70 Oracle11g Nested Loops Joins
SELECT /*+ LEADING(e) USE_NL(d)*/ * FROM emp e ,dept d WHERE e.deptno = d.deptno AND e.sal = 3000; Batch style operation using an index ROWIDs collected from an index Used in a second nested loops style operation against the driven table Can reduce physical I/O and improve performance in certain cases Could reduce readability of execution plans | SELECT STATEMENT | | | NESTED LOOPS | | | NESTED LOOPS | | TABLE ACCESS FULL | EMP | | INDEX UNIQUE SCAN | PK_DEPT | | TABLE ACCESS BY INDEX ROWID| DEPT |

71 Reverting to Oracle10g Nested Loops Joins
Use a hint or set a parameter SELECT /*+ LEADING(e) USE_NL(d) NO_NLJ_BATCHING(d)*/ * FROM emp e ,dept d WHERE e.deptno = d.deptno AND e.sal = 3000; ALTER SESSION SET OPTIMIZER_FEATURES_ENABLE = ' '; | SELECT STATEMENT | | | NESTED LOOPS | | | TABLE ACCESS FULL | EMP | | TABLE ACCESS BY INDEX ROWID| DEPT | | INDEX UNIQUE SCAN | PK_DEPT | Other relevant hints NLJ_BATCHING() NLJ_PREFETCH() NO_NLJ_PREFETCH() New undocumented parameter _nlj_batching_enabled (0 or 1)

72 Oracle12c Join Techniques
ANSI and Oracle Joins Two-way Outer Joins Join and Filter Conditions Chaining on the Outer Join Hash Join Trees Anti Joins and Semi Joins Lateral Joins Nested Loops Joins Join Elimination Adaptive Joins

73 Join Elimination – the Ins and Outs
Some unnecessary joins are eliminated SELECT e.ename ,e.deptno FROM emp e ,dept d WHERE e.deptno = d.deptno SELECT e.ename ,e.deptno FROM emp e ,dept d WHERE e.deptno = d.deptno(+) | Id | Operation | Name | Rows | | 0 | SELECT STATEMENT | | | |* 1 | TABLE ACCESS FULL| EMP | | Predicate Information (identified by operation id): 1 - filter("E"."DEPTNO" IS NOT NULL) No access to dept table (or any dept table index) in both cases on 11g Filter is unnecessary if deptno has a NOT NULL constraint

74 Conditions for Join Elimination
Oracle 10g Oracle11g Oracle12c Inner Join Outer join Outer Join No constraints Primary key on dept (or UK) Foreign key on deptno in emp

75 Join Elimination - Antijoins
Anti joins can also be eliminated SELECT e.empno, e.ename FROM emp e WHERE NOT EXISTS (SELECT 1 FROM dept d WHERE d.deptno = e.deptno); SELECT STATEMENT NESTED LOOPS ANTI TABLE ACCESS FULL EMP INDEX UNIQUE SCAN PK_DEPT filter("E"."DEPTNO"="D”.”DEPTNO” No foreign key SELECT STATEMENT TABLE ACCESS FULL EMP filter("E"."DEPTNO" IS NOT NULL) Foreign key present SELECT STATEMENT FILTER TABLE ACCESS FULL EMP filter(NULL IS NOT NULL) Foreign key and NOT NULL Dummy filter showing NO access to ANY table

76 Join Elimination - Semijoins
SELECT e.empno, e.ename FROM emp e WHERE EXISTS (SELECT 1 FROM dept d WHERE d.deptno = e.deptno); SELECT STATEMENT NESTED LOOPS SEMI TABLE ACCESS FULL EMP INDEX UNIQUE SCAN PK_DEPT filter("E"."DEPTNO"="D”.”DEPTNO” No foreign key SELECT STATEMENT TABLE ACCESS FULL EMP filter("E"."DEPTNO" IS NOT NULL) Foreign key present SELECT STATEMENT FILTER TABLE ACCESS FULL EMP Foreign key and NOT NULL No filter is necessary

77 Outer Join Elimination - Implications
A view used on the system Part of an application No access made to dept table even though join is embedded in view Access is only to the emp table Does not eliminate access to emp when referencing columns in dept Control with hints ELIMINATE_JOIN NO_ELIMINATE_JOIN Control with hidden parameter _optimizer_join_elimination_enabled CREATE VIEW empdept AS SELECT e.ename ,e.job ,e.deptno ,d.dname ,d.loc FROM emp e ,dept d WHERE e.deptno = d.deptno(+); SELECT ename,job FROM empdept;

78 Oracle12c Join Techniques
ANSI and Oracle Joins Two-way Outer Joins Join and Filter Conditions Chaining on the Outer Join Hash Join Trees Anti Joins and Semi Joins Lateral Joins Nested Loops Joins Join Elimination Adaptive Joins

79 Adaptive Joins - Oracle12c
Oracle can switch execution plans during actual execution Can occur in joins (e.g. emp with dept) Generates subplans and uses a statistics collector to buffer rows Detects if number of rows coming out of a table are more than a threshold value If so, it switches to an alternative subplan The new plan becomes the final plan Subsequent executions will ALWAYS use the final plan Statistics collector is bypassed AUTOTRACE/EXPLAIN will show the initial default plan dbms_xplan.display_cursor will show the final plan Designed to optimize when an unexpected number of rows are received Maybe because of inaccurate statistics

80 Adaptive Joins - Oracle12c
Common switch is from Nested Loops to hash join Does not work with Sort-Merge Nested Loops Hash Join Statistics Collector Table Scan dept Index Scan emp_dept_fki emp Final plan : Hash Join threshold exceeded Nested Loops Hash Join Statistics Collector Table Scan dept Index Scan emp_dept_fki emp Default plan : Nested Loops

81 Adaptive Joins - Tips Must have
optimizer_adaptive_features = (or higher) Optimizer_adaptive_reporting_only = FALSE (default) If set to TRUE, the optimizer can only report adaptive plans and not use them New column is_resolved_adaptive_plan in v$sql with values of ‘Y’ – plan is the final adaptive plan ’N’ – plan is adaptive, but final plan has yet to be decided NULL – plan is not adaptive dbms_xplan.display_cursor has new arguments, e.g. format => ‘adaptive’ Shows full plan of query including unused steps Unused steps marked with ‘-’

82 Undocumented Parameters
KSPPINM KSPPSTVL _lm_node_join_opt FALSE _abort_recovery_on_join FALSE _hash_join_enabled TRUE _multi_join_key_table_lookup TRUE _force_hash_join_spill FALSE _always_anti_join CHOOSE _optimizer_null_aware_antijoin TRUE _convert_set_to_join FALSE _push_join_predicate TRUE _push_join_union_view TRUE _push_join_union_view TRUE _optimizer_join_sel_sanity_check TRUE _ordered_semijoin TRUE _always_semi_join CHOOSE _full_pwise_join_enabled TRUE _partial_pwise_join_enabled TRUE _index_join_enabled TRUE _improved_outerjoin_card TRUE _cost_equality_semi_join TRUE _new_initial_join_orders TRUE _oneside_colstat_for_equijoins TRUE _gs_anti_semi_join_allowed TRUE _optim_new_default_join_sel TRUE _optimizer_new_join_card_computation TRUE _optimizer_sortmerge_join_enabled TRUE _optimizer_dim_subq_join_sel TRUE _optimizer_join_order_control _optimizer_join_elimination_enabled TRUE _optimizer_sortmerge_join_inequality TRUE _selfjoin_mv_duplicates TRUE _optimizer_aw_join_push_enabled TRUE _optimizer_native_full_outer_join FORCE _optimizer_eliminate_filtering_join TRUE _optimizer_join_factorization TRUE _optimizer_outer_join_to_inner TRUE _optimizer_full_outer_join_to_outer TRUE _xsolapi_sql_all_multi_join_non_base_hints _xsolapi_sql_enable_aw_join TRUE SELECT ksppinm ,ksppstvl FROM x$ksppi I ,x$ksppcv v WHERE v.indx =i.indx AND ksppinm LIKE '%join%'; Around 2750 undocumented parameters on 11g Around 3968 undocumented parameters on 12c

83 Hints from v$sql_hint 273 hints on 11g 332 hints on 12c
NAME SQL_FEATURE CLASS APPEND QKSFM_CBO APPEND NO_MONITORING QKSFM_ALL NO_MONITORING NO_SQL_TUNE QKSFM_ALL NO_SQL_TUNE IGNORE_WHERE_CLAUSE QKSFM_ALL IGNORE_WHERE_CLAUSE NO_QUERY_TRANSFORMATION QKSFM_TRANSFORMATION NO_QUERY_TRANSFORMATION OPTIMIZER_FEATURES_ENABLE QKSFM_ALL OPTIMIZER_FEATURES_ENABL GATHER_PLAN_STATISTICS QKSFM_GATHER_PLAN_STATISTICS GATHER_PLAN_STATISTICS IGNORE_OPTIM_EMBEDDED_HINTS QKSFM_ALL IGNORE_OPTIM_EMBEDDED_HI TABLE_STATS QKSFM_STATS TABLE_STATS RULE QKSFM_RBO MODE CHOOSE QKSFM_CHOOSE MODE FIRST_ROWS QKSFM_FIRST_ROWS MODE ORDERED QKSFM_CBO ORDERED ORDERED_PREDICATES QKSFM_CBO ORDERED_PREDICATES PUSH_PRED QKSFM_FILTER_PUSH_PRED PUSH_PRED ELIMINATE_JOIN QKSFM_TABLE_ELIM ELIMINATE_JOIN NO_ELIMINATE_JOIN QKSFM_TABLE_ELIM ELIMINATE_JOIN OUTER_JOIN_TO_INNER QKSFM_OUTER_JOIN_TO_INNER OUTER_JOIN_TO_INNER NO_OUTER_JOIN_TO_INNER QKSFM_OUTER_JOIN_TO_INNER OUTER_JOIN_TO_INNER HASH_AJ QKSFM_CBO ANTIJOIN NL_AJ QKSFM_CBO ANTIJOIN SEMIJOIN QKSFM_TRANSFORMATION SEMIJOIN HASH_SJ QKSFM_CBO SEMIJOIN NL_SJ QKSFM_CBO SEMIJOIN STAR QKSFM_STAR_TRANS STAR SET_TO_JOIN QKSFM_SET_TO_JOIN SET_TO_JOIN 273 hints on 11g 332 hints on 12c

84 Oracle12c Join Techniques
Carl Dudley Tradba Ltd Oracle ACE Director


Download ppt "Oracle12c Join Techniques"

Similar presentations


Ads by Google