계층형 쿼리 index 설정 0 6 2,104

by 쨍규 [SQL Query] 계층형 index [2019.07.09 14:41:54]


안녕하세요. 

계층형 쿼리를 작성중 인덱스 설정 관련 해서 문의드립니다..

고객사의 요구에 따라 다음과 같은 쿼리가 생성되었는데요..

모델링상 거래일자,승인번호가 pk로 잡혀있습니다.

계층형 쿼리를 공부하던 중  대용량 계층형 쿼리의 경우 속도를 개선하기 위한 방법으로

1.start with 컬럼에 index 생성(아래쿼리->'승인번호')

2.CONNECT BY PRIOR 의 prior쪽의 컬럼이 상수가 되기때문에 ('원거래_승인번호')를 index 생성 

pk_index: 거래일자,승인번호

index1: 승인번호, 원거래승인번호 

or

pk_index: 거래일자,승인번호

index1:승인번호

index2:원거래승인번호

결합인덱스, 단일인덱스를 고려중인데요.  index 관련해서 조언을 구하고자 합니다..

또한 , start with 부분에 in조건을 사용했는데요..이부분도 성능 개선방법이 있는지도 확인부탁드려요..

SELECT * FROM(
            SELECT
                ROWNUM no
                ,A.*
            FROM TABLE A
            START WITH
                 승인번호 IN (
                    SELECT 승인번호
                    FROM(
                        SELECT K.*,ROWNUM RN
                         FROM(
                            SELECT T.*
                            FROM(
                                SELECT * FROM(
                                    SELECT A.거래일자,A.승인번호
                                    FROM TABLE A,
                                        (SELECT
                                         B.원거래_승인번호
                                        FROM TABLE B
                                        WHERE 거래일자 BETWEEN replace('2019-07-01','-','') AND replace('2019-07-10','-','')
                                        AND 기관코드  = 'AAA'
                                        AND 거래구분  = '실패'
                                        AND 거래상태  != '제외'
                                        GROUP BY 원거래_승인번호
                                        )B
                                    WHERE A.승인번호 = B.원거래_승인번호
                                    ORDER BY 거래일자 DESC, 승인번호 DESC
                                    )WHERE ROWNUM   <=    (10 * 1)

                                   UNION ALL
                                SELECT * FROM(
                                SELECT
                                 
                                    거래일자,승인번호
                                    FROM TABLE B
                                    WHERE 거래일자 BETWEEN replace('2019-07-01','-','') AND replace('2019-07-10','-','')
                                    AND 기관코드  = 'AAA'
                                    AND 거래구분  = '성공'
                                    AND 거래상태  != '제외'
                                    ORDER BY 거래일자 DESC, 승인번호 DESC
                                )WHERE ROWNUM   <=    (10 * 1)


                            )T

                        ORDER BY 거래일자 DESC, 승인번호 DESC
                        )K
                    WHERE ROWNUM   <=    (10 * 1)
                )

)
            CONNECT BY PRIOR 승인번호 = 원거래_승인번호 AND 거래상태  != '제외'
            ORDER SIBLINGS BY 거래일자 DESC, 승인번호 DESC
        )
        WHERE no BETWEEN (10 * (1 - 1) + 1) AND (10 * 1)

by 마농 [2019.07.10 08:23:00]

쿼리가 너무 복잡하네요.
간결하게 바꿔야 할 듯 하네요.
rownum 이나 rn 조건의 정확한 의도가 뭔지? 조건이 좀 이상합니다.
숫자중에 어느 부분이 바인딩 되는 부분인지?


by 쨍규 [2019.07.10 09:51:56]

간결히 하고는 싶은데요..ㅜㅜ

rownum , rn은 대용량 페이징을 하다가  부분범위처리를 위해 적용이 된건데요. (요구사항이 계층형 페이징(대용량)입니다..)

in절 안에 쿼리는 업무요건이 있어 union all 로 처린된 부분이 있는데 인덱스 조건을 보는데는 없어도 될 부분이라 판단되어 뺴고 기재했습니다.. 

간결히하려고 할때 혹시 도움될만한 키워드같은게 있으면 좀 부탁드립니다.

 


by 마농 [2019.07.10 10:21:24]

막연하게 페이징을 한다고 표현하면 개선해 드릴 수가 없을 것 같습니다.
구체적으로 표현해 주세요.


by 쨍규 [2019.07.10 12:38:00]

1.union all 조인부분에 정렬후 부분범위처리를 위해 WHERE ROWNUM   <=    (10 * 1)

을 해줬구요. union all 한 후에도 WHERE ROWNUM   <=    (10 * 1)처리 해주었습니다.(쿼리 수정후 다시 올렸어요)

2.요구사항이 자식글에대한 검색을 해도 부모글이 나타나고 계층형으로 표현되길 원하는 상황입니다.

(union all : select1:자식글에 대한 부모글 찾기 + select2:부모글,)

 

 


by 마농 [2019.07.10 13:18:34]

너무 막연하고 모호한 표현들 뿐입니다.
table 로 표현된 부분은 동일 테이블인지 다른 테이블인지? 모르겠고.
왜 저런 복잡한 로직을 사용해야 하는지? 알수가 없구요.


by 생각 [2019.07.10 16:32:54]

WITH 문으로 끄집어내고 싶네요.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입