쿼리 0 7 4,928

by 스땐 [SQL Query] 스땐 [2010.02.19 10:41:11]


  

 

 

by 마농 [2010.02.19 10:47:38]
CALENDER 테이블의 날짜 컬럼에 인덱스가 있나요?
CALENDER 테이블의 날짜 컬럼의 데이터 타입은 뭔가요?
DATA 테이블의 시작일, 종료일 컬럼의 데이터 타입은 뭔가요?

by 스땐 [2010.02.19 10:58:41]
1. CALENDER 테이블의 날짜 컬럼에 인덱스 여부
- 네, 있습니다.
- 인덱스
C_YEAR, C_MONTH, C_DAY로 되어있습니다.

2. CALENDER 테이블의 날짜 컬럼의 데이터 타입
- varchar2 입니다.
- 컬럼 구조
C_YEAR VARCHAR2(4 BYTE),
C_MONTH VARCHAR2(2 BYTE),
C_DAY VARCHAR2(2 BYTE),
C_HOLIDAY CHAR(1 BYTE)
- 그래서 실제 쿼리에서는
TO_DATE(C.C_YEAR || '-' || C.C_MONTH || '-' || C.C_DAY, 'yyyy-mm-dd') >= A.시작일 처럼 사용했습니다.

3. DATA 테이블의 시작일, 종료일 컬럼의 데이터 타입
- 시작일, 종료일 모두 date 타입입니다.

by 마농 [2010.02.19 11:07:42]
컬럼을 가공해서 조회하므로 인덱스를 탈수가 없습니다.
현행 년, 월, 일 구분된 테이블 구조로는 기간 범위 검색시 인덱스를 타기 곤란한 구조입니다.
불가능하다는건 아닙니다. 소스가 복잡해지고, 인덱스 효율도 떨어질 뿐이죠.
테이블 구조를 바꾸길 권하고 싶지만 운영중 바꾸기는 힘들겠죠?
방법1 : 년||월||일 로 된 함수기반 인덱스 생성
방법2 : 년||월||일 로 된 컬럼을 추가하고 인덱스 생성

by 마농 [2010.02.19 11:11:53]
또한 테이블 구조 변경시에 기간 검색조건을 주실때는
인덱스 컬럼이 varchar2이므로 date형을 형변환 시켜서 비교해야 합니다.
WHERE 날짜 BETWEEN TO_CHAR(시작일,'yyyymmdd') AND TO_CHAR(종료일,'yyyymmdd')

by 스땐 [2010.02.19 11:19:44]
인덱스 말고, 쿼리 자체를 수정해서는 속도 개선이 힘든가 보네요

추천해주신 방법으로 해보겠습니다.
늘 감사드립니다.

by 마농 [2010.02.19 11:25:20]
한가지 더..
경과일수를 구할때는 보통 1을 더해주죠.. 1일 ~ 10일 (10-1+1=10일)
또한 소요일 값은 다르게도 구할 수 있습니다.
1. 종료일 - 시작일 + 1 - (Select .. Where holiday = 'Y') AS 소요일
2. (Select .. Where holiday = 'N') AS 소요일

by 스땐 [2010.02.19 13:08:44]
시도해 봐야겠어요
감사합니다...
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입