간단한겁니다 해결해주세요!! 0 5 998

by lucky27 [2011.09.07 01:45:49]


jp.jpg (310,359Bytes)

초보자입니다.
다음과 같은 쿼리를 튜닝을 해야 하는데 방법을 모르겠네요;;
대충 설명을 드리면 게시글 리스트를 뽑아오는건데
게시글 타이틀이 보이고 그 게시글에 달린 코멘트 개수를 뽑아오는겁니다.

SELECT COL1, (SELECT COUNT(1) 
FROM TAB2 
WHERE TAB1.DOC_SEQ=DOC_SEQ)
FROM TAB1
ORDER BY DOC_SEQ

원래 쿼리는 조금더 많은 컬럼과 저런식으로 서브쿼리 들어가 있는 게 세개정도 더 있습니다.
쿼리플랜을 보니 스칼라서브쿼리에서 풀스캔하여 문제가 되는것 같은데
어떻게 바꾸면 좋을까요??
TAB1에는 DOC_SEQ컬럼 하나만 인덱스로 잡혀있고
TAB2에는 DOC_SEQ컬럼이 여러개이며 인덱스는 다른 시퀀셜한 컬럼입니다.
튜닝 초보자라 너무 모르는게 많습니다..ㅠㅠ
앞으로 튜닝을 고려할땐 뭐부터 봐야하는건지 대충이라도 알려주시면 감사할것같습니다
토드로 쿼리플랜을 보는데 빨간불 들어온것만 제거하면 성능이 향상되는것인지도요..
빠른 답변 부탁드립니다!!
-----------------------------
정보가 부족하다고 하여
원래 쿼리도 적습니다.
SELECT
    R.EMP_CODE,
    R.DOC_SEQ,
    R.ACT_TYPE,
    R.OPEN_YN,
    R.REPORT_TITLE    ,
    R.WRITE_DATE,
    R.BASIC_DATE,
    R.REGIST_DATE,
    R.VIEW_COUNT,
    R.COMP_SEQ,
    R.CEMP_SEQ    ,
    R.BUSINESS_TYPE,
    EMP.DEPTCODE,
    EMP.USERNAME,
    R.CONFIRM_STATE,
    C.COMP_NAME,
    SUBSTR(R.INFO,
    0,
    100) AS INFO    ,
    (SELECT
    CODENAME
    FROM
    TB_CODEBOOK
    WHERE
    GROUPCODE='DEAL'
    AND CODE=R.BUSINESS_TYPE) AS BUSINESS_NAME    ,
    (SELECT
    CODENAME
    FROM
    TB_CODEBOOK
    WHERE
    GROUPCODE='ACTGB'
    AND CODE=R.ACT_TYPE) AS ACT_NAME    ,
    (SELECT
    CODENAME
    FROM
    TB_CODEBOOK
    WHERE
    GROUPCODE='CONFIRM'
    AND CODE=R.CONFIRM_STATE) AS CONFIRM_NAME    ,
    (SELECT
    D.DEPTNAME
    FROM
    V_GW_IFS_ORG@HR_DB_LINK D
    WHERE
    D.DEPTCODE = EMP.DEPTCODE) AS DEPT_NAME    ,
    (SELECT
    COUNT(1)
    FROM
    TB_CALL_REPORT_LOG
    WHERE
    DOC_SEQ=R.DOC_SEQ) AS HIT_COUNT    ,
    (SELECT
    COUNT(1)
    FROM
    TB_CALL_CONFIRM
    WHERE
    DOC_SEQ=R.DOC_SEQ
    AND EMP_CODE= '100314' /**P*/) AS READ_AUTH    ,
    (SELECT
    COUNT(1)
    FROM
    TB_COMMENT
    WHERE
    DOC_SEQ=R.DOC_SEQ) AS CMT_COUNT   
    FROM
    TB_CALL_REPORT R,
    V_CIS_IFS_EMP@HR_DB_LINK EMP,
    TB_CUSTOMER_COMP C   
    WHERE
    R.EMP_CODE = EMP.EMP_CODE   
    AND C.COMP_SEQ = R.COMP_SEQ
    AND R.DEL_YN='N'    
    ORDER BY
    R.WRITE_DATE DESC,
    R.DOC_SEQ DESC    
   

by 현 [2011.09.07 08:08:29]
스칼라서브쿼리에서 풀스캔하여 생기는 문제라면
TAB2 에 DOC_SEQ 로 인덱스를 만드세요.
해당 인덱스가 있는데도 안탄다면 그게 문제가 아니거나,
강제로 태울 수는 있습니다.

그런데 정말 스칼라서브쿼리에서 풀스캔하여 생긴 문제일까요?
주어진 정보가 너무 약해서요..

by lucky27 [2011.09.07 08:13:19]
글쓴이 입니다.
제가 쿼리플랜을 잘 볼줄 몰라서 확실히 어디가 문제인지는 모르는 상태라
일단 풀스캔이 문제일것이라 판단하였습니다.

또 어떤 정보가 필요한가요??
인덱스는 따로 설정해줄수 있는 상황이 아니라면 어떻게 해야할지..

by 부쉬맨 [2011.09.07 10:38:38]
혹시 이거 db_link부분에 링크가 생기는 부분쪽에 인덱스나 그런게 존재하나요?
확인해보시고 그쪽꺼를 태우는게 좋을꺼같아요힌트는...
drive_site던가 기억이가물가물하네요 db_link 관련 흰트를 줘서 해보세요 db_link는 무서운것입니다.....

by 현 [2011.09.07 13:11:06]
일단 플랜상에서 보여지는 문제점은...
스칼라서브쿼리가 full스캔하는 부분과,
뷰의 내용을 잘 알수는 없지만 드라이빙 테이블에서 범위를 줄여주지 못하고 있는 듯 합니다.

인라인뷰의 풀스캔부분은 TB_CALL_REPORT_LOG 테이블의 DOC_SEQ 인덱스와 TB_CALL_CONFIRM 테이블의 DOC_SEQ 인덱스를 생성해 주면 되지만,
V_CIS_IFS_EMP 뷰의 실체를 잘 모르니, 게다가 디비링크로 되어 있으니 좀 답답하기는 하네요..

by lucky27 [2011.09.07 13:44:10]
현님,부쉬맨님 답변 감사드립니다.
뷰는 제가 건드릴수 있는 부분이 아니라 그대로 가기로 했고
스칼라에서 풀스캔 하는부분만 해결하기 위해 DOC_SEQ에 인덱스를 생성하는 방법으로 해결하였습니다.
답변 너무너무 감사해요!!
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입