0

는이 같은 데이터를 포함하는 테이블의 열에서 전체 텍스트 인덱스를 읽고 있습니다전체 텍스트 색인 검색 페이지의 많은 수의

searchColumn 
90210 Brooks Diana Miami FL [email protected] 5612233395 

열 먼저 우편의 총, 마지막 이름입니다 이름, 도시, 주, 이메일 및 전화 번호.

이 열을 사용하여 가능한 정보를 기반으로 고객을 검색합니다.

내가 걱정하는 문제는이 열에 대한 쿼리를 수행 할 때 발생하는 많은 읽기 때문입니다. 내가 사용하고 쿼리는 다음과 같습니다 프로파일 러를 실행할 때

declare @searchTerm varchar(100) = ' "FL" AND "90210*" AND "Diana*" AND "Brooks*" ' 

select * 
from CustomerInformation c 
where contains(c.searchColumn, @searchTerm) 

지금, 나는이 검색 일반 인덱스와 여러 변수를 사용하여 다른 접근 방식을 사용하는 경우와 달리, 하나의 행을 반환하는 읽기에 대한 50,000 페이지가 있음을 알 수 아래처럼 @firstName, @LastName 같이 분류 :

WHERE C.FirstName like coalesce(@FirstName + '%' , C.FirstName) 
    AND C.LastName like coalesce(@LastName + '%' , C.LastName) 
    etc. 

나는 단지 약 140 페이지 읽기를 얻을이 방법을 사용. 접근 방식이 상당히 다르다는 것을 알고 있지만 전체 텍스트 버전의 읽기가 더 많은 이유와 일반적인 색인을 사용할 때 얻을 수있는 숫자에 가까운 방법으로 표현할 수있는 방법이 있는지 이해하려고합니다.

답변

1

나는 이것에 대해 몇 가지 생각을 가지고 있습니다. 먼저 Select *는 인덱스 된 또는 인덱싱되지 않은 모든 열을 가져와야하므로 많은 수의 페이지 읽기를 생성합니다. 모든 열을 가져올 때 가장 좋은 인덱스 계획을 사용하지 못할 가능성이 큽니다.

@searchTerm과 "FL"및 "90210 *"AND "Diana *"AND "Brooks *"의 값을 사용할 때 Where 절에 관해서는 실행될 때마다 여러 번 datapages를 확인해야합니다 . 당신이해야 할 일이 있다면이 정보를 어떻게 찾을 지 생각해보십시오. 정보가 담긴 종이를보고 검색 열에 FL이 있는지 확인하십시오. 이제는 FL과 90210 *을 포함하고 있습니다. 이제는 다이애나 플러스 등 두 가지가 모두 포함되어 있습니까?

왜 계속해서 페이지를 다시 읽어야하는지 알 수 있습니다. 두 번째 쿼리는 좁게 정의 된 두 개의 열만 살펴 봐야합니다.

자세한 내용은 Brent Ozar가 무료로 제공하는 수업을 제안합니다. How to think like the SQL Server Engine

도움이 되었기를 바랍니다.

+0

좋아요,'*'에 대한 코멘트를 얻었습니다. 필자가 필요로하는 컬럼 만 가져 왔고,'* '를 넣으면 질문이 너무 복잡해지지 않습니다. 왜냐하면 많은 컬럼이 있기 때문입니다. 또한, 엔진이 페이지를 처음으로 들여다 보면 조건을 확인해야 할 때마다 페이지를 읽는 것이 이상 할 것이라고 생각합니다. 하지만 브렌트의 튜토리얼을 확인해 보겠습니다. –

관련 문제