by 도뎡이 [SQL Query] oracle union 쿼리성능개선 [2022.11.29 18:33:55]
안녕하세요 선배님들!
NEO_MIS_INTEREST_REG_TBL 테이블을 기준으로 USER_TBL과 CO_OLD_USER_TBL을 조인해서 전체 데이터를 UNION 하여 GROUP BY 하는 다음의 쿼리가 있습니다.
SELECT CD_INTEREST, count(*) CNT FROM ( SELECT N.CD_INTEREST FROM NEO_MIS_INTEREST_REG_TBL N, USER_TBL U WHERE N.USER_KEY = U.REC_KEY AND ACCESS_LOC IN ('11', '21') UNION ALL SELECT N.CD_INTEREST FROM NEO_MIS_INTEREST_REG_TBL N, CO_OLD_USER_TBL U WHERE N.USER_KEY = U.REC_KEY AND ACCESSION_LOC IN ('11', '21') ) GROUP BY CD_INTEREST ;
기준이 되는 테이블은 NEO_MIS_INTEREST_REG_TBL 테이블이고, 조건절의 파라미터는 동일한데
해당 쿼리를 실행하면 응답이 내려오는 데까지 9~10초 정도가 소요됩니다.
해당 쿼리를 조인으로 변경해 보려 했으나, LEFT 조인을 걸어도 성능은 마찬가지입니다..
해당 쿼리를 어떻게 하면 개선할 수 있을까요?
선배님들의 소중한 피드백 미리 감사드립니다 :)
SELECT cd_interest , SUM(cnt) cnt FROM (SELECT n.cd_interest , COUNT(*) cnt FROM neo_mis_interest_reg_tbl n , user_tbl u WHERE n.user_key = u.rec_key AND u.access_loc IN ('11', '21') GROUP BY n.cd_interest UNION ALL SELECT n.cd_interest , COUNT(*) cnt FROM neo_mis_interest_reg_tbl n , co_old_user_tbl u WHERE n.user_key = u.rec_key AND u.accession_loc IN ('11', '21') GROUP BY n.cd_interest ) GROUP BY cd_interest ; SELECT n.cd_interest , COUNT(*) cnt FROM neo_mis_interest_reg_tbl n , (SELECT rec_key FROM user_tbl WHERE access_loc IN ('11', '21') UNION ALL SELECT rec_key FROM co_old_user_tbl WHERE accession_loc IN ('11', '21') ) u WHERE n.user_key = u.rec_key GROUP BY n.cd_interest ; SELECT n.cd_interest , COUNT(a.rec_key) + COUNT(b.rec_key) cnt FROM neo_mis_interest_reg_tbl n LEFT OUTER JOIN user_tbl a ON n.user_key = a.rec_key AND a.access_loc IN ('11', '21') LEFT OUTER JOIN co_old_user_tbl b ON n.user_key = b.rec_key AND b.accession_loc IN ('11', '21') WHERE a.rec_key IS NOT NULL OR b.rec_key IS NOT NULL GROUP BY n.cd_interest ;