오라클 간단한 쿼리 질문입니다! 0 10 589

by 마이닝 [Oracle 기초] [2017.08.04 11:46:11]


안녕하십니까! 개인적으로 쿼리 테스트중에 있습니다.
아래쿼리는 모두 같은 결과를 나타내는 쿼리입니다.
시작년도가 2016으로 시작하는 데이터들을 검색하는데요, lp_sdt 컬럼은 DATA타입으로 되있습니다.
데이터가 너무많아서 검색속도가 느립니다
그나마 3개중에 속도는 1번째 꺼가 조금 빠르더군요.
전체데이터대비 조회데이터가 40%이상이라 인덱스는 불필요할것같고..  저기서 더 빠르게 검색할수있는 방법이있는지 궁금합니다.


전체 로우수 1207226 / 검색 로우수 506826  

SELECT *  FROM TEST_DB@TS
WHERE lp_sdt like '16%'


SELECT *  FROM TEST_DB@TS
WHERE substr(trim(lp_sdt),1,2) = '16'


SELECT * FROM TEST_DB@TS
WHERE to_char(lp_sdt,'YYYY') = '2016'

 

by jkson [2017.08.04 12:20:46]

SELECT * FROM TEST_DB@TS
WHERE INSTR(LP_SDT,'16') = 0

WHERE INSTR(LP_SDT,'16') = 1

이렇게도 해보세요.

오타났네요;


by 마이닝 [2017.08.04 13:57:05]

감사합니다^^


by jkson [2017.08.04 14:09:28]

오잉? 다시 읽어보니 lp_sdt 가 날짜형이네요?

왜 lp_sdt between '2016-01-01' and '2016-12-31'

로 하시지 않는 거죠?

이게 젤 빠를텐데요.

날짜형이 맞다면 적으신 방법 모두 날짜형->문자형으로 변환한 뒤에

필터하게 되어 느리구요. (날짜형에 LIKE 해주셔도 내부적으로 문자형으로 변환합니다.)

제가 적어드린 INSTR 방법도 컬럼이 문자형일 때 사용하는 방법이고

문자형 중간에 글자를 찾을 때는 보통 LIKE '%%' 검색보다 빠르다고 알려져있는데

문자 첫 시작은 거의 비슷할 것 같습니다.

날짜형 컬럼은 날짜형태로 조회하세요.


by 마이닝 [2017.08.04 17:34:39]

감사합니다 데이터형은 비트윈검색이 더빠른거였군요 !


by jkson [2017.08.04 17:42:43]

데이트형이 비트윈 검색이 빠른 게 아니라

데이터 형이 날짜형인데 함수를 씌워서 문자로 만든 다음 검색하는 것이 비효율적이라는 거예요.

함수자체가 데이터 처리가 필요한 건데

데이터가 100만건이면 100만번 함수가 실행되어야 하니까요.


by 우리집아찌 [2017.08.04 14:33:35]

영원히 '16%' 만 검색하실거 아니시면 INDEX가 필요할듯합니다.

 


by jkson [2017.08.04 14:36:44]

전체 데이터의 40%를 읽어야 한다고 하시네요.


by 우리집아찌 [2017.08.04 14:53:45]

'17%' , '18%' 는 평생안쓰실거 아니면 써야지~


by 우리집아찌 [2017.08.04 15:00:45]

제일 좋은건 파티셔닝을 연도별로 하면 해당 파티션만 읽으니까 제일빠를듯 

업무상 맞는지는 모르지만.. 


by 마이닝 [2017.08.04 17:35:28]

인덱스도 한번써볼게요 ! 감사합니다

 

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