Could you let me know if the following is correct for the subsiquent code and explain plan:
a hash join is used to link availability.adate with requirements.rdate and requirements.wardshiftid
with wardshift.wardshiftid but then a series of nested loops are used to probe for person.personid
where it matches personID in the rows resulting from the hash join. However a Cartesian product
operation is caused possibly by a lack of join conditions in the last 5 lines of code:
Yes a have read my backside off to come to this conclusion, but is it correct?
CODE
SELECT TBLPERSON.SNAME, TBLPERSON.FNAME,
to_char(TBLWARDSHIFTS.SHIFTSTART,'HH24:MI') as ReqStart,
to_char(TBLWARDSHIFTS.SHIFTEND,'HH24:MI') as ReqEnd,
TBLREQUIREMENTS.RDATE
FROM TBLAVAILABILITY , TBLREQUIREMENTS , TBLWARDSHIFTS , TBLPERSON
WHERE TBLAVAILABILITY.ADATE = TBLREQUIREMENTS.RDATE
AND TBLAVAILABILITY.PERSONID = TBLPERSON.PERSONID
AND TBLREQUIREMENTS.WARDSHIFTID = TBLWARDSHIFTS.WARDSHIFTID
AND (to_char(TBLREQUIREMENTS.RDATE,'MM')=to_char(SYSDATE,'MM'))
AND (
(To_Number(to_char(TBLWARDSHIFTS.SHIFTSTART,'HH24'))>=15)
AND
(To_Number(to_char(TBLWARDSHIFTS.SHIFTSTART,'HH24'))<20)
AND (TBLAVAILABILITY.ANYLATE=1)
)
CODE
1 | NESTED LOOPS | | | | | | |
| 2 | NESTED LOOPS | | 233 | 15611 | | 1469 (2)| 00:00:18 |
|* 3 | HASH JOIN | | 233 | 10951 | | 1003 (3)| 00:00:13 |
|* 4 | TABLE ACCESS FULL | TBLREQUIREMENTS | 5031 | 60372 | | 980 (3)| 00:00:12 |
| 5 | MERGE JOIN CARTESIAN | | 3061 | 104K| | 22 (0)| 00:00:01 |
|* 6 | TABLE ACCESS FULL | TBLWARDSHIFTS | 1 | 20 | | 3 (0)| 00:00:01 |
| 7 | BUFFER SORT | | 4639 | 69585 | | 19 (0)| 00:00:01 |
|* 8 | TABLE ACCESS FULL | TBLAVAILABILITY | 4639 | 69585 | | 19 (0)| 00:00:01 |
|* 9 | INDEX UNIQUE SCAN | PK5 | 1 | | | 1 (0)| 00:00:01 |
| 10 | TABLE ACCESS BY INDEX ROWID| TBLPERSON | 1 | 20 | | 2 (0)| 00:00:01
CODE
3 - access("TBLAVAILABILITY"."ADATE"="TBLREQUIREMENTS"."RDATE" AND
"TBLREQUIREMENTS"."WARDSHIFTID"="TBLWARDSHIFTS"."WARDSHIFTID")
4 - filter(TO_CHAR(INTERNAL_FUNCTION("TBLREQUIREMENTS"."RDATE"),'MM')=TO_CHAR(SYSDATE@!,'MM'))
6 - filter(TO_NUMBER(TO_CHAR(INTERNAL_FUNCTION("TBLWARDSHIFTS"."SHIFTSTART"),'HH24'))>=15 AND
TO_NUMBER(TO_CHAR(INTERNAL_FUNCTION("TBLWARDSHIFTS"."SHIFTSTART"),'HH24'))<20)
8 - filter("TBLAVAILABILITY"."ANYLATE"=1)
9 - access("TBLAVAILABILITY"."PERSONID"="TBLPERSON"."PERSONID")