안녕하세요. 정말 많은 도움을 얻고 있어 감사드립니다.
이번에 처한 제 문제는 스스로 해결을 해보아도 잘 안풀려서 또 올려봅니다.
테이블 구조는 아래와 같습니다.
'그룹' 테이블
번호 | 그룹명 | 등록자ID | 날짜
'그룹상세' 테이블
번호 | 부모번호 | 성명 | 핸드폰 | 이메일 | 팩스 | 등록자ID | 날짜
'그룹' 테이블은 T_ADDR_GROUP
'그룹상세' 테이블은 T_ADDR_DETAIL 입니다.
인덱스 정보는 아래와 같습니다.
T_ADDR_GROUP (NO) *PK
T_ADDR_GROUP (NAME, NO)
T_ADDR_DETAIL (NO) *PK
T_ADDR_DETAIL (USER_ID, NO, PARENT_NO)
사용한 쿼리는 아래와 같습니다.
SELECT * FROM (
SELECT ROWNUM AS RNUM, A.*, (SELECT COUNT(B.NO) FROM T_ADDR_DETAIL B WHERE B.PARENT_NO = A.NO) AS GROUP_NAME FROM (
SELECT * FROM T_ADDR_GROUP A WHERE USER_ID = 'lee9982'
ORDER BY A.NAME ASC
) A WHERE ROWNUM <=10
) WHERE RNUM >= 1
그룹 상세 테이블에 데이터는 약 500만건 입니다. 운영시 예상되는 데이터는 2000~3000만건 이구요..
문제는 그룹 리스트에서 그룹에 속한 그룹수를 보여주어야 하는데, 서브 쿼리에서 카운트를 해보았는데
카운트를 하면 5~6초 이상이 걸립니다. 카운트를 빼면 뭐 데이터가 별로 없어 1초도 안걸리지만요..
상세 정보를 입력시/삭제시 마다 그룹 테이블에 카운트를 UP/DOWN 시키는게 좋을까요? 아니면
다른 좋은 방법이 있을까요?
실행계획은 아래와 같습니다.
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|Operation | Object Name | Rows | Bytes | Cost | Object Node | In/Out | PStart | PStop | Access Predicates | Filter Predicates |
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SELECT STATEMENT Optimizer Mode=ALL_ROWS | | 9 | 2 K | 4 | | | | | | |
| SORT AGGREGATE | | 1 | 3 | | | | | | | |
| INDEX FAST FULL SCAN IN_T_ADDR_DETAIL01 | 438 K | 1 M | 5210 | | | | | | "B"."PARENT_NO"=:B1 |
| VIEW | | 9 | 2 K | 4 | | | | | | "RNUM">=1 |
| COUNT STOPKEY | | | | | | | | | | ROWNUM<=10 |
| VIEW | | 9 | 1 K | 4 | | | | | | |
| SORT ORDER BY STOPKEY | | 9 | 360 | 4 | | | | | | ROWNUM<=10 |
| TABLE ACCESS FULL T_ADDR_GROUP | 9 | 360 | 3 | | | | | | "USER_ID"='lee9982' |