2013-04-17 7 views
2

자동 완성 서비스에 fulltextsearch를 사용하고 싶습니다. 즉, 빠르게 작동해야합니다. 최대 2 초.SQL 서버 전체 텍스트 검색을 최적화하는 방법

검색 결과는 다른 테이블에서 가져온 것이므로 함께 결합하는보기를 만들었습니다. 사용중인 SQL 함수는 FREETEXTTABLE()입니다.

쿼리가 매우 느리게 실행되며 때로는 최대 40 초까지 실행됩니다. 방법에 대한 첫째, 추가 아이디어 :

나는이 개 질문이 나는 기본 테이블 정수 데이터 타입의 클러스터 인덱스 컬럼 (아닌 GUID)

이 있는지 만든 쿼리 실행 시간을 최적화하려면 전체 텍스트 검색을 빠르게하려면? (하드웨어 업그레이드 제외) 둘째, 전체 텍스트 카탈로그를 다시 작성한 후 매번 검색 쿼리가 매우 빠르게 (1 초 미만) 작동하지만 첫 번째 실행에만 적용됩니다. 두 번째로 쿼리를 실행하면 몇 초가 걸리며 거기에서 내려 오는 언덕이 있습니다. 왜 이런 일이 발생하는지 생각해보십시오.

+0

보기 코드를 게시 할 수 있습니까? – Keith

+0

전체 텍스트 인덱스가 조각화되어 있습니까? 어쩌면 이것이 도움이 될 것입니다 : [SQL Server 유지 관리 : 간과 된 색인] (http://itsalljustelectrons.blogspot.com/2016/03/SQL-Server-Maintenance-Overlooked-Index.html) – DMason

답변

1

Here's a good resource 그러나 성능을 정말로 향상 시키려면 하드웨어 업그레이드에 대해 생각해야합니다. (데이터 및 전체 텍스트 인덱스 파일을 읽기 최적화 된 디스크로 분리하고 로그 및 tempdb를 쓰기 최적화 된 디스크로 이동하여 총 성능이 향상되는 것을 보았습니다. 총 4 개의 추가 디스크 + 1 개의 OS 및 SQL 서버 바이너리) 내가 추천

일부가 아닌 다른 하드웨어 솔루션 :.

  1. 함으로써 전체 텍스트 인덱스의 크기를 줄이고, 더 중지 단어를 정의하는 내장 정지 단어 목록을 사용자 정의합니다.
  2. tempdb의 파일 구조를 변경하십시오. herehere을 참조하십시오.
  3. 보기에서 FREETEXTTABLE을 두 번 이상 호출하는 경우보기가 1 회만 호출하면되므로 데이터 구조를 변경하는 것이 좋습니다.

그러나 이들 중 어느 것도 속도를 높이기 위해 찾고있는은 총알 해결책이 될 수는 없습니다. 거기에 다른 요인 (어쩌면 성능이 좋지 않은 서버, 네트워크 대기 시간, 서버의 리소스 경합 ..)이있을 수 있습니다. 특히 전체 텍스트 검색은 내가 본 것의 반대 인 각 실행마다 느려집니다. 내 경험.

2

쿼리가 매우 빠르고 아주 간단 할 수있는 카탈로그를 다시 작성 후 처음입니다 이유 :

재 구축 할 당신이 카탈로그를 삭제하고 다시 작성하는 경우, 인덱스가 한 약간의 시간이 소요됩니다. 다시 작성하기 전에 쿼리를 만들면이 적은 이 있기 때문에 쿼리가 빠릅니다. 또한 쿼리 결과에 더 적은 행이 있다는 것을 알아야합니다.

따라서 색인의이 다시 작성된 후에는 쿼리 속도 테스트가 이됩니다.

다음 선택은 인덱스의 크기 (및 조각화)를 확인하는 데 유용 할 수 있습니다.크기가 커지지 않으면 인덱스 재구성이 완료됩니다.)

-- Compute fragmentation information for all full-text indexes on the database 
SELECT c.fulltext_catalog_id, c.name AS fulltext_catalog_name, i.change_tracking_state, 
    i.object_id, OBJECT_SCHEMA_NAME(i.object_id) + '.' + OBJECT_NAME(i.object_id) AS object_name, 
    f.num_fragments, f.fulltext_mb, f.largest_fragment_mb, 
    100.0 * (f.fulltext_mb - f.largest_fragment_mb)/NULLIF(f.fulltext_mb, 0) AS fulltext_fragmentation_in_percent 
FROM sys.fulltext_catalogs c 
JOIN sys.fulltext_indexes i 
    ON i.fulltext_catalog_id = c.fulltext_catalog_id 
JOIN (
    -- Compute fragment data for each table with a full-text index 
    SELECT table_id, 
     COUNT(*) AS num_fragments, 
     CONVERT(DECIMAL(9,2), SUM(data_size/(1024.*1024.))) AS fulltext_mb, 
     CONVERT(DECIMAL(9,2), MAX(data_size/(1024.*1024.))) AS largest_fragment_mb 
    FROM sys.fulltext_index_fragments 
    GROUP BY table_id 
) f 
    ON f.table_id = i.object_id