결합인덱스,랜덤액세스 관련 0 2 947

by 쨍규 [SQL Query] 결합인덱스 랜덤액세스 [2018.12.26 14:57:00]


안녕하세요. 1억건정도의 데이터에서 페이징 처리를 위해 사이트내용등을 참조해서

부분범위처리를 위해 row_num을 활용한 top-n queries(oracle 12c에서는 offset --rows를 사용)사용하려고 하고 있습니다.(맞는말인지 모르겠네요..);;;

궁금한 사항은 검색조건이 A~L까지라고 했을때 결합인덱스를 사용해 정렬조건 및 검색속도 개선을 하고 싶은데요..

필수사용조건 A:코드성(=), B:기간(between:서브 쿼리 사용을 통한 in으로 변경) 두개 정도 이며

나머지 조건들은 선택성에 의한 다양한 조건들이 존재합니다.

사용빈도가 많은 A,B컬럼만 결합 인덱스로 사용할 경우 나머지 조회조건이 포함될 때 확인랜덤액세스가 발생될 거 같고...

이 랜덤액세스를 줄이기 위해 나머지 컬럼 인덱스를 통합해서 A~L 다 결합한 인덱스를 생성하려고 하는데, 이 방법이

괜찮은 방법일까요...만약 A~L의 결합인덱스를 생성했을때 A,B만 사용할 경우도 A~L의 인덱스를 탈지와 결합인덱스 컬럼 순서를 어떻게 

배치하는게 좋을까요??

  

 

by 마농 [2018.12.26 17:31:08]

네. a, b 를 기본으로 추가 조건 컬럼을 인덱스에 포함하시면 됩니다.
인덱스 크기가 커지는 단점이 있지만, 렌덤엑세스 부하를 줄이는 효과가 있으며
추가 조건이 들어 오지 않는다 해도 기본 조건 타는데 문제는 없습니다.
기간 조건을 IN 으로 변경 하는 것은? 굳이 그렇게 해야 할 필요가 있을지 고민해 보시구요.


by 쨍규 [2018.12.26 17:54:55]

네. 답변 감사합니다...

쿼리부분은 -다음-과 같고..모든 조회조건을 추가해줬네요. 질문답변쪽에서 마농님 글잘 읽고 있습니다.

감사합니다. 인덱스를 여러개 만들고 union all 로 합쳐주려다가(select /*+ hint */ * from table where d is null union all  select /*+ hint */ * from table where d is null -> 이런식으로 하면 c조건이 없을 경우  select 절을 안타는것을 이용...) 조합 갯수가 너무 많아서...문의글남겼던거였습니다..

어느것이 효율이 더좋을 지 궁금하기도 하구요.. 

-다음-

SELECT
            P.*
        FROM
        (
            SELECT 
            rowNo AS no,
            Q.*
            FROM
            (
                SELECT /*+ INDEX_DESC(h index_001)*/
                    A,
                    B,
                    ....Z
                FROM TB_RT_VH_TR_201802 h
                WHERE A = ''
                AND B BETWEEN '' AND ''
                --A,B는 필수
                <if test="c" != null and c != ''">
                (AND C = ''
                <IF>
                ....
                <if test="L" != null and L != ''">
                AND L = ''
                </IF>
                
                OFFSET ((50-1)*10) ROWS FETCH NEXT 10 ROWS ONLYkd
            )Q
        )P;

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