Oracle varchar 형 date 비교 인덱스 질문

민사장   
   조회 3364   추천 0    

 

Oracle varchar 형 date 비교 인덱스 질문 입니다.


가령

TABLE1.DATE1 (varchar, 8)

TABLE2.START_DATE (varchar, 8)

TABLE2.END_DATE (varchar, 8)

과 같이 컬럼이 정의되어 있을때 데이터는 모두 "20180101" 과 같이 들어가 있습니다.


WHERE TABLE1.DATE1 >= TABLE2.START_DATE

            AND TABLE1.DATE1 <= TABLE2.END_DATE


이부분의 인덱스를 만드려고 한다면

DATE1 의 인덱스를 생성하고...


START_DATE, END_DATE 같이 만들어야 하나요 아니면

START_DATE 따로, END_DATE 따로 인덱스를 만들어야 하나요?


문자형 >= AND <= 비교일때는 어떤 경우에 타는지 긍금합니다.

 

짧은글 일수록 신중하게.
DAP박인호 2019-08
질문이 이해가 가지 않습니다.
3개다 컬럼이 아닐 것 같은데..
3개다 컬럼이면 인덱스 만들 의미가 없습니다.

현재 또는 특정일자와 start_date, end_date 비교를 하면
일반적으로 이력데이터가 쌓이는 테이블로
미래 데이터가 적고, 범위 검색 후순위에 오는 index 컬럼은 사용되지 않기 때문에
end_date  컬럼만으로 인덱스를 구성합니다.
민사장 2019-08
질문을 좀 더 구체적으로 수정해 보았습니다. 부탁드립니다!!
기본적으로 쿼리에서 >= 은... > OR = 입니다. 따라서 이러한 쿼리는 대부분의 경우 인덱스 자체를 타지 않습니다. 인덱스를 태우려면 NOT < 로 해야합니다.
전 DBA 는 아니라서...인덱스 설정 관련해서는 다음분께............
DAP박인호 2019-08
해당 Where절도 구체적이지 않습니다.

1번 테이블에 Index를 생성하기 위해서는
TABLE1.DATE1 >= '20190823' 처럼
row가 제한되는 조건이 있어야 합니다.
또는
2번테이블 선행테이블이 되는 NL 조인에서 index를 사용하게 됩니다.

위 예시된 조건절만 있다고 가정했을때
Index없이 사용하는 것이 좋을 것으로 추측 됩니다.
(일반적으로 다른조건없이 위와같은 조건절로 사용할 업무는 존재하지 않습니다. Join은 부모자식관계가 있어야 발생합니다.)
     
민사장 2019-08
가령 TABLE1.DATE1 은 시험 응시일, TABLE2.START_DATE, END_DATE 는 시험 응시기간 이라고 보면 되거든요.
응시기간에 맞게 신청한 것인지 WHERE 로 체크하려 한다고 그냥 예시로서 생각해 보면 될것 같습니다.
이 경우에도 답변주신 설명이 맞는것인가요?
          
DAP박인호 2019-08
해당 예일 경우
Table1에는 시험과목, 응시자, 응시일자
table2에는 시험과목, 응시기간
이렇게 구성되어야 맞기 때문에 조건절에 1.시험과목=2.시험과목
처럼 조건이 추가 되어야 합니다.

전체 데이터를 응시기간에 맞게 신청한 것인지 체크한다면
전체 데이터를 체크하는 거라서 index를 태울 필요가 없습니다.
index를 만들어도 타지 않고 실행 될 것입니다.

시험과목이 아주 많이 관리 된다면( 2번 테이블이 선행테이블이 되어 NL조인으로 실행할 경우)
table1에 시험과목,응시일자로 복합 인덱스 구성을 고려해 볼 수 있겠네요.
그런데 응시기간안에 응시하지 않은 데이터가 존재할 가능성은 매우 낮기 때문에
복합인덱스의 효용은 없습니다.
table1에 시험과목 index와 응시자 index 각각 구성하는 경우만 있을 것으로 보입니다.
               
민사장 2019-08
사실 시험은 아니고요, 그냥 이해하기 쉽게 비유해서 말씀드린것입니다.
varchar 날짜 비교를 한다고 보면 되고요.

(1) 시작일, 종료일을 하나의 인덱스로 잡는게 나은지
(2) 따로 시작일과 종료일 각각 인덱스를 만드는게 나은것인지 이게 제가 궁금한 부분입니다.
                    
DAP박인호 2019-08
업무 모델에 따라 다름.
* 그래서 INDEX 설계가 어렵습니다.
위 예에서는 INDEX를 잡을 필요가 전혀 없는 경우.

시작일, 종료일이 포함된 테이블이 자식 테이블(주로 이력 관리 테이블)일 경우
부모테이블이 TABLE1.DATE1 은 INDEX를 만들 필요가 없으며( 검색조건이 있을 경우는 생성고려)
TABLE2는 일반적으로 종료일만 인덱스에 포함됩니다.
(데이터가 계속 쌓이기 때문에 시작일은 검색조건에 항상 만족하는 경우가 많아 INDEX 구실을 못합니다.)
          
DAP박인호 2019-08
table1에 시험과목, 응시일자로 복합인덱스를 구성해
인덱스를 타게 쿼리하는 방법도 있습니다.
SELECT *
FROM T1, T2
WHERE T1.과목 = T2.과목
AND T1.응시일 < T2.시작일
UNION ALL
SELECT *
FROM T1, T2
WHERE T1.과목 = T2.과목
AND T1.응시일 > T2.종료일

위와 같이 응시일이 응시기간에 벗어난 데이터( 즉 가능성이 낮은 데이터)
만 뽑을 경우는 구성한 INDEX를 탈 가능성이 높습니다.

그런데 이런 업무는 1회성 또는 수행 횟수가 많지 않은 경우라 INDEX를 구성하는 것을 권장하지 않습니다.


QnA
제목Page 1266/5728
2015-12   1781657   백메가
2014-05   5256704   정은준1
2024-10   1631   뚜뚜김대원
2012-05   9840   예관신규식
2015-09   3915   겜머
2023-02   1770   블루영상
2012-05   5333   6툴
2012-05   4994   정승환
2021-06   4901   돌풍감자
2019-01   3384   신관악산
2024-10   1262   하양까망
2014-05   4300   송진현
2020-02   4546   봉래
2017-10   5888   Won낙연
2014-05   6052   설영수
2016-09   4748   슬러그
2014-05   4666   파리대왕
2015-09   6755   comduck
2021-06   3182   무쏘뿔처럼
2014-05   6017   대한민국
2017-10   5455   Doker
2016-09   4578   김강호