0

내 테이블은 약 7M 기록을 가지고 있으며, 그 구조는 다음처럼 : (LocationID을 ( 은 "테이블 위치를 만들 : 여기이상한 전체 텍스트 검색 성능 문제

create table Locations (LocationID (PK, int, not null),LocationName varchar(100) NOT NULL /*e.g. 'Paris'*/, ItemsNo (int, null), ICode char(1) null /*e.g. 'C'*/, LocationExtended nvarchar(max) null) 

HTML 버전 PK, int)를, null가 아닌, LocationName의 VARCHAR (100) NOT NULL로, ItemsNo (INT, 널 (null)), ICODE의 문자 (1) 널 (null)은

내 쿼리가 정말 간단 NVARCHAR (최대) 널 (null)) "을 LocationExtended :

여기 693,210

HTML 버전 : "를 포함 어디에 위치에서, ItemsNo를 최고 20 LocationName을 선택 (LocationExtended, @의 SearchTerms) 및 ICODE = 'C'와 ItemsNo은 ItemsNO 내림차순으로 널 위해 아니다"거기에 물론

LocationExtended 필드에 대한 전체 텍스트 카탈로그입니다. 이제

의 매개 변수의 @SearchTerms와와 인덱스 조금 놀자 (때문에 나는 단지 내가 @의 SearchTerms = '파리와 프랑스'에 대한 빠른 실행 시간을 얻을 LocationID 열에 클러스터 된 인덱스가있는 경우

@ SearchTerms = 'France'에 대한 SLOW 실행 시간 (LocationExtended 필드에는 프랑스의 모든 도시/마을에 대해 수천 개의 레코드가 있기 때문에 Paris와 France 키워드를 모두 포함하는 LocationExtended 필드에는 거의 레코드가 없습니다). "파리"와 "파리 북"과 "남 파리" "파리"@의 SearchTerms = '프랑스'반품 : @의 SearchTerms = '파리와 프랑스'반품 : 즉

결과는 같은 수 있습니다

빠른 실행을 위해 두 시나리오가 필요하기 때문에 Icode 및 ItemsNO 열과 LocationID 포함 열이있는 Locations 테이블에 클러스터되지 않은 인덱스가 만들어졌습니다. @의 SearchTerms = '프랑스'하지만 @의 SearchTerms = 느린 회 슈퍼 빠른 실행 시간을 '파리와 프랑스'

지금이 시점에서 막혔어요 : 나는 결과를 가지고이 새로운 인덱스를 만듦으로써

는 반전.

는 내가 어떤 ideea의이 평가 될 것입니다

윈도우 2003 서버에서 SQL Server 2008을 실행하고 있음을 언급. 고마워요.

답변

1

SELECT 쿼리에 OPTION (RECOMPILE)을 추가하여 옵티마이 저가 @SearchTerms 변수의 값을 '볼'수있게하고 그에 따라 더 나은 계획을 선택하십시오. 또한 CONTAINSTABLE을 사용하도록 쿼리를 다시 작성하는 것이 좋습니다.이 방법은 더욱 유연합니다.

인덱스 :

+0

나는 (재 컴파일) 옵션을 시도했지만 전혀 개선되지 않았다. CONTAINS 테이블을 사용하면 약 10 % 향상되었지만 여전히 만족스럽지 않습니다. – George

0

마지막으로이 날 위해 일을 포함 colums

쿼리로 LocationID와 ItemsNO에 LocationID 및 클러스터되지 않은 인덱스에서 인덱스를 클러스터 : select TOP 20 * from (select ROW_NUMBER() over (order by ItemsNO DESC) as RowID,ItemsNO,LocationName FROM Locations where contains(LocationExtended,@SearchTerms) and ItemsNO>0 and ICode='C') t

이 감소 실행 시간에서 850 ms ~ ~ 45 ms