문제

우리는 클라이언트, 고객 등을 "검색"하는 수많은 쿼리를 가지고 있습니다.이름, 이메일 등으로 검색할 수 있습니다.우리는 다음과 같은 방식으로 LIKE 문을 사용하고 있습니다:

SELECT * 
FROM customer 
WHERE fname LIKE '%someName%'

전체 텍스트 인덱싱이 시나리오에 도움이 됩니까?우리는 SQL Server 2005를 사용하고 있습니다.

도움이 되었습니까?

해결책

DBMS에 따라 다릅니다.나는 전체 텍스트 기능을 사용하지 않는 한 대부분의 시스템이 전체 텍스트 색인을 활용하지 못할 것이라고 생각합니다.(예: 일치/대 mySQL의 경우 또는 MS SQL의 경우 FREETEXT/CONTAINS)

다음은 SQL Server에서 전체 텍스트 인덱싱을 사용하는 시기, 이유 및 방법에 대한 좋은 문서입니다. SQL Server 전체 텍스트 인덱싱 이해

다른 팁

FTS ~할 수 있다 이 시나리오에서 도움을 주려면 그만한 가치가 있는지 여부가 문제입니다.

우선 그 이유를 살펴보겠습니다. LIKE 가장 효과적인 검색이 아닐 수도 있습니다.당신이 사용할 때 LIKE, 특히, % 비교가 시작될 때 SQL Server는 모든 단일 행에 대한 테이블 검색을 모두 수행해야 합니다. 그리고 확인 중인 열을 바이트 단위로 확인합니다.

FTS는 이름 변형에 대한 더 나은 통계와 마찬가지로 데이터 일치를 위한 더 나은 알고리즘을 가지고 있습니다.따라서 FTS는 Smith를 찾을 때 Smith, Smythe, Smithers 등을 매칭하는 데 더 나은 성능을 제공할 수 있습니다.

그러나 FTS를 사용하는 것은 조금 더 복잡합니다. CONTAINSFREETEXT 그리고 검색의 난해한 형식.그러나 FName 또는 LName이 일치하는 검색을 수행하려면 OR 대신 하나의 문을 사용하여 검색할 수 있습니다.

FTS가 효과적인지 확인하려면 보유하고 있는 데이터의 양을 확인하세요.나는 수억 개의 행으로 구성된 데이터베이스에서 FTS를 사용하는데 이는 다음을 사용하여 검색하는 것보다 실질적인 이점입니다. LIKE, 하지만 모든 테이블에 사용하지는 않습니다.

테이블 크기가 수백만 미만으로 더 합리적인 경우 검색할 각 열에 대한 인덱스를 생성하여 비슷한 속도를 얻을 수 있으며 SQL Server는 테이블 스캔이 아닌 인덱스 스캔을 수행해야 합니다.

내 테스트 시나리오에 따르면:

  • SQL 서버 2008
  • "Worda WordB Wordc ..."과 같은 문자열이있는 10.000.000 행 (1 ~ 30 단어)
  • CONTAINS(column, "wordB")를 사용하여 개수(*) 선택
  • 결과 크기는 수십만
  • 카탈로그 크기 약 1.8GB

전체 텍스트 인덱스는 2초 범위에 있었지만 '% wordB %'와 같은 1~2분 정도였다.

그러나 이는 추가 선택 기준을 사용하지 않는 경우에만 계산됩니다! 예:내가 좀 사용했다면 "'접두사%'처럼" 또한 기본 키 열에서는 전체 텍스트 인덱스로 이동하는 작업이 일부 필드에서 문자열 검색을 수행하는 것보다 비용이 더 많이 들기 때문에 성능이 더 나빴습니다(너무 많지 않은 경우).

그래서 나는 전체 텍스트 색인을 권장합니다 오직 "무료 문자열 검색"을 수행해야 하거나 검색의 일부 특수 기능을 사용해야 하는 경우...

특히 MSSQL에 대한 질문에 답하기 위해 전체 텍스트 인덱싱은 아니다 귀하의 시나리오에 도움이 됩니다.

해당 쿼리를 개선하려면 다음 중 하나를 수행할 수 있습니다.

  1. 열에 전체 텍스트 카탈로그를 구성하고 CONTAINS() 함수를 사용합니다.
  2. 주로 접두사(예:이름 시작 부분부터 일치) 조건자를 다음과 같이 변경하고 해당 열에 대한 인덱스를 생성할 수 있습니다.

    여기서 fname은 'prefix%'와 같습니다.

(1)은 쿼리 성능이 큰 문제가 되지 않는 한 아마도 과잉일 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top