Investigating further, it looks like the main reason is just that the select ..group by.. having.. is just a lot faster than the partitioned version. The basic queries to get the duplicates are:
This runs in about 30 seconds and the plan is:Code:SELECT BUSINESS_DATE, SRC_SYS_FEED_ID, NVL(t.DEAL_ID, '~NVL') AS DEAL_ID,NVL(t.LEG_TYPE_CD, '~NVL') AS LEG_TYPE_CD FROM SCHEDULE t WHERE BUSINESS_DATE = :p_business_date and SRC_SYS_FEED_ID = :p_src_sys_feed_id GROUP BY BUSINESS_DATE, SRC_SYS_FEED_ID, DEAL_ID, LEG_TYPE_CD HAVING COUNT(*) > 1
SELECT STATEMENT Hint=CHOOSE
FILTER
SORT GROUP BY
PARTITION RANGE SINGLE
TABLE ACCESS FULL SCHEDULE
The partiioning version is:
This takes twice as long and has plan:Code:select * from (SELECT ROWID, SRC_SYS_FEED_ROW_ID, SCHEDULE_ID, NVL(t.DEAL_ID, '~NVL') AS DEAL_ID, NVL(t.LEG_TYPE_CD, '~NVL') AS LEG_TYPE_CD, COUNT(1) OVER (PARTITION BY NVL(t.DEAL_ID, '~NVL') ,NVL(t.LEG_TYPE_CD, '~NVL') ) DUPS FROM SCHEDULE t WHERE t.BUSINESS_DATE = :p_business_date and t.SRC_SYS_FEED_ID = :p_src_sys_feed_id) where dups > 1
SELECT STATEMENT Hint=CHOOSE
VIEW
WINDOW SORT
PARTITION RANGE SINGLE
TABLE ACCESS FULL SCHEDULE




Reply With Quote