MSSQL

검색에 관하여...

스쿠터로세계일주 2011. 4. 6. 14:55

게시판이나 포탈이나...사방에 요즘 검색기능 없는 건 없을 정도로 많이 검색을 활용한다.

자모를 구분하는 검색부터, 검색에 이용되는 단어나 컬럼들을 테이블에 따로 모아서 그곳에서만 검색을 해서 원래 정보를 찾아가는 방식이나...

 

검색을 최적화 하는건 DB를 관리하는 사람이라면 꼭 기회되면 해두고 싶은 일일 것으로 생각된다.(나만?)

 

왜냐하면 마구 LIKE검색을 날려낸다면 그 서버는 곧 이별을 고하거나...아니면 고객들의 빗발치는 항의가 이어질 것이기 때문이다...창하나 열리는데 10초걸린다...같은..

 

기본적인 방식은 검색에 사용되는 컬럼들은 따로 구분해서 저장하는 것이 중요하다.(이쪽을 전문으로 하지는 않았지만 실무에서 느낀 점이니 전문가의 의견이 아님을 ......ㅎㄷㄷ;;;)

 

검색에 사용되는 컬럼의 값과 찾아가야 하는 테이블의 고유 값을 저장해놓고, 그 테이블에서 검색을 하는것이 필요하다. 거기에선 뭐...like검색을 하든 뭘하든 그 용도로만 사용되기 때문에 다른 서비스에는 영향을 미치지 않기 때문이다.

 

 예를들어 상품정보를 상품명(p_title)으로 검색한다고 한다면..

 상품정보가 들어있는 테이블에(T1)서 바로 검색을 실행한다면, 그 상품정보테이블을 참조하는 프로시저나 쿼리문이 영향을 받게된다.

 따라서 상품정보에서 상품의 고유값(p_id)과 상품명을 별도의 테이블(T2)에 저장해놓고(상품등록이나 수정, 삭제시 같이 변동 될 수 있도록 쿼리문을 짜야함은 기본)

 그 별도의 테이블에서 검색을 실행해서 나온 상품의 고유값(T2.p_id)과 상품정보의 고유값(T1.p_id)값만 비교하면 된다. 물론 고유값이라면 클러스터링 인덱스 설정이 되어 있어야 할 것이다.

 

그리고..참고로 상품의 이름이나 외국이름..등으로 검색할 때 값이 없다고 하는 경우를 보면  replace()를 제대로 안해줘서 그런 경우가 많다.

예를들어 "대한 민국"과 "대한민국" 은 다른 값인데 이걸 검색하려니 당연히 에러가 날 것이다

따라서 검색의 기본은 모든 공백을 replace()로 없애주고 하는 것이다.

ex) select p_id from t1 where replace(p_title,' ','') = replace(@p_title,' ','')  와 같이 공백같은 검색에 방해되는 것들은 모두 제거해서 동일하게 만들어서 검색을 해야만 한다.

 

'MSSQL' 카테고리의 다른 글

MSSQL 튜닝업체 추천!  (0) 2011.05.25
MSSQL2005 온라인인덱싱(online index)  (0) 2011.04.06
mssql group by 작은팁  (0) 2011.04.06
MSSQL2005 row_number() 함수로 게시판 페이지 불러오기  (0) 2011.04.06
MSSQL 5030오류 해결책  (0) 2011.01.25