-- 그룹명검색/카운트
SELECT /*+ INDEX(B PK_T_ADDR_DETAIL01) */
COUNT(B.NO) AS CNT
FROM T_ADDR_GROUP A
, T_ADDR_DETAIL B
WHERE A.NO = B.PARENT_NO
AND B.USER_ID = 'test'
;
SELECT COUNT(A.NO) AS CNT
FROM T_ADDR_DETAIL A
WHERE A.USER_ID = 'test'
AND EXISTS (SELECT 1 FROM T_ADDR_GROUP WHERE NO = A.PARENT_NO)
;
제가 생각하는 추천 실행계획은
1. 그룹명 검색 없을 때(b => a)
t_addr_detail(user_id, parent_no) 인덱스에서
user_id 로 인덱스 검색하고, 검색된 인덱스의 parent_no 를 t_addr_group 에 조건으로 제공합니다.
t_addr_group(no) 인덱스를 검색합니다.
2. 그룹명 검색 있을 때(a => b)
t_addr_group(group_name, no) 인덱스에서
group_name 으로 인덱스 검색하고, 검색된 인덱스의 no 를 t_addr_detail 에 조건으로 제공합니다.
검색조건 User_id 와 앞서 인덱스 탐색한 no 의 조합으로
t_addr_detail(user_id, parent_no) 를 검색합니다.
t_addr_group(group_name, no) 인덱스가 있으면 좋겠고
없다고 해도 t_addr_group 전체건수가 많지 않다면 상관 없을듯 합니다.
직접 해볼수 없는 상황에서 생각만으로 답변하니 정답이 아닐 수 있습니다.
우선 실행계획을 확인해 보고 스스로 판단하셔야 합니다.
일단 제가 원하는 실행계획을 위한 힌트는 다음과 같습니다.
SELECT /*+ LEADING(a) USE_NL(b) INDEX(b pk_t_addr_detail01) */ COUNT(*)
FROM t_addr_group a
, t_addr_detail b
WHERE b.user_id = 'test'
AND a.name LIKE '테스%'
AND a.no = b.parent_no
;