I have a below query to execute in Oracle, which is taking more time due to high volume of data. CUSTOMER_ADDRESS table has close to 450K records and CONTROL_REC has close to 1.7M records. It may be because of GROUP BY and a subquery. Even after using parallel threads, it is not working.
Can someone, please help to simplify the query to run faster?
SELECT /*+ parallel(A,8) */
A.SETID, A.CUST_ID, A.ADDRESS_SEQ_NUM,
A.ALT_NAME1, A.ALT_NAME2,
A.LANGUAGE_CD, A.COUNTRY, A.ADDRESS1,
A.ADDRESS2, A.ADDRESS3, A.ADDRESS4,
A.CITY, A.NUM1, A.NUM2, A.ADDR_FIELD1,
A.ADDR_FIELD2, A.ADDR_FIELD3,
A.COUNTY, A.STATE, A.POSTAL,
A.IN_CITY_LIMIT, A.COUNTRY_CODE,
A.PHONE, A.EXTENSION, A.FAX,
B.SETCNTRLVALUE, MAX(A.EFFDT) AS EFFDT
FROM CUSTOMER_ADDRESS A,
CONTROL_REC B
WHERE B.RECNAME = 'CUST_ADDRESS'
AND A.EFFDT = (
SELECT MAX(A_ED.EFFDT)
FROM CUSTOMER_ADDRESS A_ED
WHERE A.SETID = A_ED.SETID
AND A.CUST_ID = A_ED.CUST_ID
AND A.ADDRESS_SEQ_NUM = A_ED.ADDRESS_SEQ_NUM
AND A_ED.EFFDT <= SYSDATE)
AND A.SETID = B.SETID
GROUP BY A.SETID, A.CUST_ID,
A.ADDRESS_SEQ_NUM, A.ALT_NAME1,
A.ALT_NAME2, A.LANGUAGE_CD,
A.COUNTRY, A.ADDRESS1, A.ADDRESS2,
A.ADDRESS3, A.ADDRESS4, A.CITY,
A.NUM1, A.NUM2, A.ADDR_FIELD1,
A.ADDR_FIELD2, A.ADDR_FIELD3,
A.COUNTY, A.STATE, A.POSTAL,
A.IN_CITY_LIMIT, A.COUNTRY_CODE,
A.PHONE, A.EXTENSION, A.FAX, B.SETCNTRLVALUE;