2010-06-14 2 views
3

현재 많은 필드 (nvarchars 및 bigints)를 사용하여 큰 데이터베이스 (500MB - 10GB 이상, 10 개 테이블)를 검색하는 방법을 찾고 있습니다. 검색해야하는 많은 필드가 동일한 테이블에 없습니다.MS Sql 전체 텍스트 검색 vs. LIKE 식

예 : '5124 피터'에 대한 검색, 모든 항목을 반환해야하는 ...

  • 가에서 5124으로 ID를 가지고,
  • 은 제목이나 설명
  • 에서 '피터'가
  • 는 id가있다 5124 그것을
  • 에서 자신의 주소에 '5124'또는 '피터'와 사용자가 만든 '피터'라는 이름의 사용자 또는 사용자가 만든
  • 에서 5124으로 항목 유형 ID를 가지고있다.

검색은 어떻게해야합니까? 나는 MS-SQL의 전체 텍스트 검색이 LIKE 키워드를 사용하는 쿼리보다 훨씬 더 성능이 좋으며 문법이 더 명확하다고 생각하지만 bigint (id) 값을 검색 할 수 없다고 생각한다. 성능에 문제가있어 DB에 대한 삽입 속도가 느려집니다. 내 프로젝트에는 독서보다 더 많은 삽입이 있으므로 문제가 될 수 있습니다. 사전에

감사합니다, 마크

답변

1

I MS SQL에서 필요한 성능을 얻지 못할 것이라고 생각하지 마십시오. 검색 할 모든 데이터/테이블을 포괄하는 매우 복잡한 쿼리를 작성해야하며, 쿼리하는 것과 동시에 데이터베이스에 데이터를 쓰는 불필요한 추가 작업이 필요합니다.

Apache Solr (http://lucene.apache.org/solr/) 또는 Lucene (http://lucene.apache.org)을 살펴 보시기 바랍니다. Solr은 Lucene을 기반으로 만들어지며, 기본적으로 책 뒤쪽의 색인과 같은 거꾸로 된 파일 색인을 생성하는 데 사용될 수 있습니다 (용어 1은 문서 1, 3, 7 등에 나타납니다). Solr은 검색 엔진 - in-a-box를 제공하며, 데이터를 색인화하는 방법과 위치를 알려주는 몇 가지 메커니즘이 있습니다. Lucene은 더 낮은 수준이며보다 유연하게 색인 및 검색 아키텍처를 설정할 수있게 해줍니다.

Solr의 좋은 점은 웹 서비스로 사용할 수 있다는 것입니다. 따라서 Java에 익숙하지 않은 경우 원하는 언어로 Solr 클라이언트를 찾고 어떤 언어로든 색인 및 검색 코드를 작성할 수 있습니다 자신에게 맞는. 다음은 C#의 일부를 포함하여 Solr 용 클라이언트 라이브러리 목록에 대한 링크입니다. http://wiki.apache.org/solr/IntegratingSolr 그 부분부터 시작하겠습니다.

3
당신은 스핑크스 검색으로, 독립형 검색 엔진을 시도 할 수

:

http://www.sphinxsearch.com/index.html

또는 Apache SOLR :

http://lucene.apache.org/solr/

+0

나는 더 많은 시간이있을 때 이것들을 봐야 만하지만 MS SQL Server 만 사용한다면 해결책을 알고 싶습니다. – Marks

+1

전체 텍스트 검색을 사용하여 비 정수 (ID) 열을 검색 할 수 있습니다. 그런 다음 검색 쿼리에서 숫자를 추출하고 표준 SQL select 쿼리를 사용하여 정수 (ID) 열을 테스트합니다. 인덱싱 성능 문제를 완화하는 데 도움이되는 몇 가지 기술이 있습니다. http://stackoverflow.com/questions/933351/ms-sql-server-2000-slow-full-text-indexing을 참조하십시오. – Mike

0

전체 텍스트 검색은 같은 표현식보다 확실히 더 효과적입니다. 당신이 할 수있는 것은 테이블이 아닌 뷰에 전체 텍스트 인덱스를 생성하는 것입니다.이 인덱스는 나중에 테이블 조인을 저장할 수있는 검색된 인덱스 일 뿐이므로 조금 더 빠르게 할 수 있습니다. 이 뷰에서는 bigint 열을 varchar로 변환 할 수 있습니다.이 경우 varchar 열은 검색 할 모든 열을 하나의 varchar 열로 연결하여 색인을 생성 할 수 있습니다. 이를 수행하려면 SCHEMABINDING을 사용하여 뷰를 작성하고 적어도 하나의 고유 한 컬럼을 선택하고 클러스터 된 고유 인덱스를 작성해야합니다.

삽입 성능에 대한 전체 텍스트 효과에 관해서는 대량 삽입에 대한 영향을 많이 알아 채지 못했지만 stackoverflow 질문 3301470에서 누군가가 성능이 SQL 2005에서 느리지 만 SQL에서는 느린 것으로 언급했습니다. 2008 년 수정되었습니다. 이것은 이제 모든 개별 행 삽입 (예 : 2008 년 실행) 이후에 대량 삽입 후에 인덱스를 업데이트하기 때문입니다. 2005를 실행중인 경우 개선을 위해 대량 삽입에 대한 변경 내용 추적을 비활성화하고 이후에 수동으로 업데이트 색인을 호출 할 수 있습니다.