어느 쿼리가 수행속도가 더 좋을까요? 0 7 8,092

by 짱짱 [SQL Query] query date rgst_ymd [2009.08.20 14:11:26]


어젯밤엔 너무 더웠네요.
밤새  잘 주무셨나요? 전 서너번 깼다는...... 
오늘 밤은 좀 시원할듯 하네요. 

rgst_ymd는 date타입입니다.

각 년도별로 통계를 뽑으려고 하는데,  

1)   to_char(rgst_ymd, 'YYYY') = '2008'

2 )  rgst_ymd between '20080101' and '20081231'


두가지 조건문중에서 어떤 것이 수행속도가 나을까요?

인덱스는 걸려있지 않습니다.

(지금 두 경우 다 date타입이  형변환된거 맞죠?)

by 손님인척 [2009.08.20 14:22:19]
2번에 한표!

by 마농 [2009.08.20 14:28:06]
인덱스항목이 나이라면 큰 차이는 없을듯 합니다.
그래도 컬럼을 변형하지 않는 것이 그나마 쬐끔 낫겠죠.
2번은 조건값이 날짜형으로 변경되어 비교됩니다.
rgst_ymd컬럼은 변화가 없죠.
2번 쿼리는 잠재적 오류 가능성을 가지고 있습니다.
명시적으로 형변환을 시켜서 비교하시는 것이 좋습니다.

by 짱짱 [2009.08.20 14:45:56]
to_date로 명시적으로 형변환을 해서 비교를 해야겠군요.
근데 쿼리를 짜다보면.....
쿼리의 길이를 줄이는게 더 좋아보여서(?) 착각을 종종 하네요.
답변 감사합니다~

by 러드 [2009.08.20 15:20:26]
select *
from EMP
where to_char( HIREDATE, 'yyyy') = '1981'

--0 SELECT STATEMENT 1 37 3 46587 3
--1 0 TABLE ACCESS FULL EMP 1 37 3 46587 3
;
select *
from EMP
where HIREDATE between '19810101' and '19811231'

--그냥 날짜형은 바로 between 하니까 바이트값이 많이 올라가네요^^
--여기 나오는 바이트에 111에 의미가 뭐죠? 다른곳은 다 37인데 ㅋㅋ
--0 SELECT STATEMENT 3 111 3 44208 3
--1 0 FILTER
--2 1 TABLE ACCESS FULL EMP 3 111 3 44208 3
;

select *
from EMP
where to_char(HIREDATE, 'yyyymmdd') between '19810101' and '19811231'

--그래서 마농님이 말씀하신 명시적으로 변경이 이런 의미??
--0 SELECT STATEMENT 1 37 3 46972 3
--1 0 TABLE ACCESS FULL EMP 1 37 3 46972 3


;
select *
from EMP
where HIREDATE like '1981%'

--0 SELECT STATEMENT 1 37 3 43787 3
--1 0 TABLE ACCESS FULL EMP 1 37 3 43787 3
;
select *
from EMP
where substr(HIREDATE,1,4) = '1981'

--0 SELECT STATEMENT 1 37 3 44487 3
--1 0 TABLE ACCESS FULL EMP 1 37 3 44487 3
;

간단하게 해봤지만!! ^^

보기에는 like좋아 보이네요!!!


by 마농 [2009.08.20 16:17:37]
러드님. 제가 말한 명시적 형변환은 그런게 아닙니다.
조건값을 날짜형으로 변경하라는 의미.

by 러드 [2009.08.20 16:31:59]
between '19810101' and '19811231' 을 날짜형태로 표현하라는 의미라는거시죠??

by 마농 [2009.08.20 16:40:56]
rgst_ymd BETWEEN '20080101' AND '20081231'
이 조건은 내부적으로 다음과 같이 변형되어 실행됩니다.
rgst_ymd BETWEEN TO_DATE('20080101') AND TO_DATE('20081231')
이때 TO_DATE('20080101')은 사용툴이나 오라클 환경에 따라 에러가 발생할 수 있습니다.
따라서 이런 암묵적인 형변환이 발생하지 않도록 명시적으로 기술해야 합니다.
rgst_ymd BETWEEN TO_DATE('20080101','yyyymmdd') AND TO_DATE('20081231','yyyymmdd')

추가적으로 생각할것은 rgst_ymd의 데이터 저장형태입니다.
일자까지만 저장되어 있다면 위와 같이 해도 무방하지만 시분초까지 저장되어 있다면
12월31일 0시0분1초부터 23시59분59초 자료가 누락됩니다.
이런것까지 신경써서 쿼리를 작성하셔야 합니다.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입