like 조건절 성능개선법좀 알려주세요 0 9 1,303

by 파워간 [SQL Query] [2018.05.21 15:51:38]


안녕하세요 like 조건절 효율을 올릴 수 있는 방법 문의 드립니다.

col1 -> 회사명으로 가정하였을때

 

방법 1.

select col1 from t1

where instr(col1, :바인드 ) >0;

-> full table

 

방법2.

select col1 from t1

where col like :바인드%;

col1에 인덱스를 걸고 방법2처럼 사용하려고 생각했는데 문제가 있었습니다.

예) 한국전력공사

바인드가 한국, 한국전력은 문제가 없으나

사용자가 전력공사로 검색을하였을경오 나오지 않는 문제.

결국 양쪽에 %%를 걸면 full table을 타는 문제가 있음.

 

방법3

context index를 활용해보려 했지만, 한글에 한계가 있는것으로 보이더라고

select col1 from t1

where contains(col1, :바인드) >0

:바인드에 한국이 들어갔다고 가정하면

where col1 like '한국 %' 의 형태의 결과 값이 나더라고요

한국 띄고 %의 형태

 

아무리 생각해도 다른방법이 생각나지 않아 문의 드립니다.

 

고수님들 답변 부탁드려요 ^^

by 우리집아찌 [2018.05.21 17:10:30]

검색엔진 형태로 만드시는건가요?

그러면 한국/전력/공사/한구전력/전력공사 이런식으로 따로 row 만들어서 서치 하지 않나요?


by 파워간 [2018.05.21 17:46:26]

네 맞습니다

 

효율적인 방법이 있는지 확인 부탁드려요 ^^

 

따로 만들기에는 현재까지 등록된 데이터가 너무 많아서요.

 


by 우리집아찌 [2018.05.21 17:52:21]

가장간단한 형태로는 조회시 조건(INDEX)을 추가하는 방법이 있겠지요.. ㅎㅎ

 


by 파워간 [2018.05.21 18:20:16]

instr함수를 function based index로 생성 할 수 있나요?

where instr(col1 :바인드)  > 0

 

혹시 생성할 수 있으면 예시 부탁드려요


by 우진 [2018.05.21 17:55:39]
select col1 from t1
where col1 like(case when :col1=‘전력공사’ then ‘한국’ end)||’%’ ;

 


by 파워간 [2018.05.21 18:20:49]

한두개가 아니라서요 ㅜㅜ

 

요렇게 사용하기는 힘들어요


by 우진 [2018.05.21 18:25:13]

sql sever 에는 펑션인덱스가 없어요 


by 우진 [2018.05.21 18:52:46]

like 인덱스를 사용하면서 검색결과에 안나오는 문제를 해결할 수 있는 예시일 뿐입니다 ^^ 

when instr(:col1 , 바인드) > 0 then sustr(col1, 1) ||’%’ 


by 마농 [2018.05.23 08:57:27]

앞 뒤 % 라면 SQL만으로는 특별한 방법은 없습니다.
방법이 있다면? 위에 언급한 full-text 검색이구요. 더 나아가서는 검색엔진을 이용하는 것입니다.
질문하신 FBI 는 입력값이 (컬럼과 상수) 일때만 가능합니다. 여기서는 입력값이 변수이므로 불가능합니다.
위 쿼리를 보면 col1 만 조회하므로 full table 이 아닌 full index 를 탈것 같네요.
full index 를 안타고 full table 탄다면? col1 IS NOT NULL 조건을 추가해 보세요.
일반적으로 LIKE 보다 INSTR 이 가볍다고 알려져 있습니다.

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