2015-01-22 3 views
0

SQL Server의 전체 텍스트 검색이 너무 느리게 실행되는 문제가 있습니다. 쿼리 (아래 참조) 참고로SQL Server 전체 텍스트 검색이 너무 느립니다.

select * from 

(SELECT 
    (row_number() over (order by b.BookKey)) as RowNumber, 
    p.PublishCity, 
    b.BookKey, 
    b.BookTitle 
from 
    Books b (nolock) 
    inner join PublishedRegions p (nolock) 
     on b.BookKey = p.BookKey 
where 
    contains(p.PublishCity, 'France') or 
    contains(b.BookTitle, 'France') 
) as t1 

where 
    RowNumber between 200 and 210 
  • 을 전체 텍스트 검색을 실행하고 가입하는 분에 걸쳐 복용

    는 책 테이블과 PublishedRegions 테이블에 약 50 만 행이

  • SQL Server에서는 테이블 당 하나의 전체 텍스트 인덱스 만 정의 할 수 있기 때문에 Books 테이블에 PublishedCity를 넣을 수 없습니다.
  • 참고 : 마지막 부분 인 RowNumber 200과 210은 임의로 삽입되었습니다. 어떤 행 집합을 선택해도 결과가 여전히 오래 걸릴 수 있습니다.
  • Books 테이블에 전체 텍스트 인덱스가 있습니다. NVARCHAR (255)
  • PublishedRegions는 PublishedCity NVARCHAR (255)에 전체 텍스트 인덱스가 있습니다.

아이디어를 어떻게 향상시킬 수 있습니까?

감사합니다.

+0

사용중인 Sql Server의 버전 –

답변

2

Sql Server 2012+을 사용하는 경우 Row_Number 대신 paging을 사용하면 OFFSET..FETCH을 사용하십시오. 이 같은.

SELECT 
    p.PublishCity, 
    b.BookKey, 
    b.BookTitle 
FROM 
    Books b (nolock) 
    INNER JOIN PublishedRegions p (nolock) 
     ON b.BookKey = p.BookKey 
WHERE 
    CONTAINS(p.PublishCity, 'France') OR 
    CONTAINS(b.BookTitle, 'France') 
ORDER BY b.BookKey OFFSET 199 ROWS FETCH NEXT 11 ROWS ONLY 

Offset-Fetch 접근 방식은 Row_number보다 더 나은 성능을 제공합니다. Check here 자세한 비교는

관련 문제