2014-06-16 3 views
0

나는 다음과 같은 쿼리가 :느린 실행중인 SQL Server 쿼리

DECLARE @CompanyId bigint 
DECLARE @SearchText nvarchar(4000) 
SET @CompanyId=160 
SET @SearchText='%02863%' 
SELECT j.Id FROM Job (NOLOCK) j WHERE (j.Deleted = 0 AND j.CompanyId = @CompanyId) 
    AND (j.Name LIKE @SearchText OR j.DisplayId LIKE @SearchText OR j.ClaimNumber LIKE @SearchText) 
UNION SELECT j.Id FROM Job (NOLOCK) j INNER JOIN Address (NOLOCK) a ON a.Id = j.AddressId 
    WHERE j.Deleted = 0 AND j.CompanyId = @CompanyId 
    AND a.SearchAddress LIKE @SearchText 
UNION SELECT j.Id FROM Job (NOLOCK) j INNER JOIN Contact (NOLOCK) c ON c.Id = j.CustomerId 
    WHERE j.Deleted = 0 AND j.CompanyId = @CompanyId 
    AND c.SearchName LIKE @SearchText 

실행 위쪽으로 10 초의 때때로하고있다.

DB가 꽤 작아서 오래 걸릴 것이라고 생각하지 않습니다.이 쿼리를 올바르게 구성했는지 또는 변경해야하는지 궁금합니다.

내가 읽은 바로는 전체 텍스트 검색을 구현하면 직접적인 비교이기 때문에 많은 도움이된다고 생각하지 않습니까?

또한이 쿼리에서 companyId = @ companyId 및 deleted = 0 인 작업에 속한 주소와 연락처 만 검색하면 좋겠습니까? 또는 전체 DB에서 모든 주소와 연락처를 검색 한 다음 작업 기준에 따라 필터링합니까?

답변

1

다른 모든 사항을 하나의 명령문으로 결합하는 것이 좋습니다. 지금 일어나고있는 일은 세 번의 전체 인덱스 스캔을 수행 한 다음 중복 된 데이터를 필터링하는 것입니다 (유니온 포함). 이 경우 테이블을 한 번 사용하여 '또는'을 쿼리에 사용하는 것이 더 빠를 수 있습니다.

마지막 질문에 답하기 위해 현재 전체 인덱스 스캔을 사용하여 Sql 서버가 행 단위로 더 많은 작업을 수행합니다. 그러면 첫 번째 데이터 지점을 살펴볼 것입니다. j.deleted = 0이면 SQL은 계속해서 다음 조건을 평가합니다. 그래서 companyId = @companyId인지 확인합니다. 그렇다면 계속해서 다음 조건을 확인하십시오.

검색을 수행하도록 쿼리를 변경하면 sql이 찾고있는 것을 빠르게/쉽게 처리 할 수 ​​있습니다.

DECLARE @CompanyId bigint 
DECLARE @SearchText nvarchar(4000) 

SET @CompanyId=160 
SET @SearchText='%02863%' 

SELECT j.Id 
FROM Job (NOLOCK) j 
WHERE j.Deleted = 0 
    AND j.CompanyId = @CompanyId 
    AND (j.Name LIKE @SearchText 
    OR j.DisplayId LIKE @SearchText 
    OR j.ClaimNumber LIKE @SearchText 
    OR (exists select 1 
       From address (nolock a) 
       Where a.id = j.addressid 
       and  a.SearchAddress like @SearchText) 
    or (exists select 1 
       From contact (nolock) c 
       Where c.id=j.customerid 
       and  c.SearchName like @SearchText) 
    ) 
+0

이 쿼리를 변경하면 거의 즉각적인 결과를 얻을 수 있습니다! 와우, 정말 고마워 !! – Scottie

0
@SearchText='%02863%' 

인덱스에서이 문자열을 검색하므로 전체 인덱스 스캔이 발생합니다. 검색 문자열이 '02863 %'와 같은 경우 인덱스 찾기를 사용할 수 있고 더 효율적으로 시작할 수 있습니다.

실행 계획을 게시 할 수 있다면 가장 유용 할 것입니다.