2011-02-15 2 views
2

나는 매우 느리게 실행 다음과 같은 쿼리가 :전체 텍스트 검색은 매우 느린 가입

SELECT Id FROM 
    (
     SELECT E.MessageId 
     FROM [MessageEnvelopes] AS E INNER JOIN 
       [Folders] AS F ON F.Id = E.FolderId 
     WHERE F.MailboxId = 1 
    ) AS SUB1 INNER JOIN 
    (
     SELECT M.Id 
     FROM [Messages] AS M 
     WHERE CONTAINS(M.*, '"my*" AND "search*"') 
    ) AS SUB2 
    ON SUB1.MessageId = SUB2.Id 

는 기본적으로,이 전체 텍스트 검색 (SUB2)와 메시지 선택 쿼리 (SUB1)를 결합합니다. 하위 쿼리는 명확하게 구분되어 있습니다 (하위 쿼리를 함께 조인 할 때와 동일한 문제가 발생 함). 이 쿼리는 약 15 초가 걸리는 반면, 두 하위 쿼리는 개별적으로 실행될 때 즉시 반환됩니다.

관련된 테이블은 작습니다 (최대 2000 행). 모든 외래 키에는 색인이 있습니다. 실행 계획에 병목 현상이 나타나지 않습니다. 이 쿼리가 왜 그렇게 느리게 실행되는지 나는 잘 모른다.

+1

CONTAINSTABLE()을 사용해 보셨습니까? 이것은 일반적으로 CONTAINS()보다 더 잘 수행되어야합니다. –

+0

Greco, 같은 일은 발생하지 않습니다. – Carvellis

답변

0

쿼리 계획에 FullTextMatch가 평가되기 전에 세 테이블이 함께 조인되었다고 가정합니다. 쿼리를 개별적으로 실행하면 조인 전에 메시지에 대해 FullTextMatch를 평가하도록 계획을 강제합니다. 테이블에있는 데이터의 양과 Where 절의 MailboxId에 대한 "선택적인"방법에 따라 이는 좋거나 나쁨 일 수 있습니다. 분리 된 쿼리를 사용하여 성능이 훨씬 좋아진 것을 알게되면 중개 결과를 저장하고 결합 된 출력에 대한 변수를 쿼리하기 위해 두 개의 테이블 변수를 사용할 수 있습니다.

+1

그렇더라도 테이블에는 2000 개의 레코드가 있습니다. 이러한 작은 테이블에서 15 초가 걸릴 쿼리가 있어야합니다. – Carvellis

관련 문제