SQL Server에서 왼쪽 조인 테이블에 대한 여러 기준을 어떻게 전체 텍스트로 검색합니까?

StackOverflow https://stackoverflow.com/questions/35954

  •  09-06-2019
  •  | 
  •  

문제

원래 다음과 같은 쿼리가 있습니다.

select c.Id, c.Name, c.CountryCode, c.CustomerNumber, cacc.AccountNumber, ca.Line1, ca.CityName, ca.PostalCode
from dbo.Customer as c
left join dbo.CustomerAddress as ca on ca.CustomerId = c.Id
left join dbo.CustomerAccount as cacc on cacc.CustomerId = c.Id
where  c.CountryCode = 'XX' and (cacc.AccountNumber like '%C17%' or c.Name like '%op%'       
or ca.Line1 like '%ae%' or ca.CityName like '%ab%' or ca.PostalCode like '%10%')

90,000개의 레코드가 있는 데이터베이스에서 이 쿼리를 실행하는 데 약 7초가 걸립니다(분명히 모든 가입 및 좋아요에 부담이 가중됩니다).

해당 컬럼에 대한 전체 텍스트 검색을 통해 쿼리 실행 시간을 줄이는 방법을 찾으려고 노력해 왔습니다.그러나 특히 내 조인 조건이 검색어의 일부가 아니기 때문에 이와 같은 세 개의 테이블 조인이 있는 전체 텍스트 검색의 예를 본 적이 없습니다.

전체 텍스트 검색에서 이를 수행할 수 있는 방법이 있습니까?


@데이비드

네, ID에 색인이 있습니다.

CustomerAddress 항목(CityName, PostalCode 등)에 색인을 추가하려고 시도했는데 쿼리 시간이 3초로 단축되었지만 여전히 이와 같은 작업에는 너무 느리다는 것을 알았습니다.

ID를 제외한 모든 텍스트 필드는 nvarchar이고 Line1은 nvarchar 1000이므로 속도에 영향을 미칠 수 있지만 여전히 그렇습니다.

도움이 되었습니까?

해결책

쿼리 분석기를 통해 실행하고 쿼리 계획이 무엇인지 확인하세요.내 생각에는 이중 루트(즉,%ae%) 검색으로 인해 일치하는 행을 찾을 때 테이블 스캔이 수행됩니다.이중 루트 검색은 일반적으로 어떤 종류의 인덱스도 사용할 수 없기 때문에 본질적으로 느립니다.

다른 팁

메모:이는 실제 답변은 아니며 실제로 성능 문제를 일으키는 원인이 무엇인지 명확히 하려는 시도일 뿐입니다.

90,000개의 레코드는 실제로 상당히 작은 데이터 세트이며 두 개의 조인만으로 쿼리가 비교적 간단합니다.CustomerAddress.CustomerId 및 CustomerAccount.CustomerId에 대한 색인이 있습니까?이는 where 조건 LIKE 조건자보다 성능 문제를 일으킬 가능성이 더 높은 것 같습니다.일반적으로 모든 열에서 동시에 일치하는 항목을 찾기 위해 검색하고 있습니까?

나는 David의 제안을 반영하고 싶습니다.아마도 RDBMS가 쿼리를 실행하는 방식(예: 테이블 스캔 또는 인덱스 사용)을 조사하고 싶을 것입니다.

한 가지 빠른 확인은 텍스트 검색과 관련된 쿼리 부분의 시간을 측정하는 것입니다.이 같은:

SELECT  ca.Line1, ca.CityName, ca.PostalCode
FROM    CustomerAddress as ca
WHERE   ca.CustomerId = <some id number>
AND     (ca.Line1 LIKE '%ae%' OR ca.CityName LIKE '%ab%' OR ca.PostalCode LIKE '%10%');

시간이 오래 걸리면, LIKEs가 문제입니다(한 번에 하나의 표현식을 제거하세요). OR해당 열 중 하나만이 속도 저하를 일으키는지 확인하려면 ed 행을 확인하세요.속도가 빠르면 조인이 의심됩니다.

CustomerAccount 테이블에 대해서도 유사한 쿼리를 작성할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top