페이지 매김시 SQL Server 쿼리 속도가 느려짐


14

SQL Server 2012의 다음 T-SQL 쿼리에서 이상한 동작이 나타납니다.

SELECT Id 
FROM dbo.Person 
WHERE CONTAINS(Name, '"John" AND "Smith"')
ORDER BY Name

이 쿼리 만 실행하면 2 초 안에 약 1,300 개의 결과를 얻을 수 있습니다 (에 대한 전체 텍스트 색인이 있음 Name)

그러나 쿼리를 다음과 같이 변경하면

SELECT Id 
FROM dbo.Person 
WHERE CONTAINS(Name, '"John" AND "Smith"')
ORDER BY Name
OFFSET 0 rows
FETCH NEXT 10 ROWS ONLY

10 개의 결과를 얻으려면 20 초 이상이 걸립니다.

다음 쿼리는 더 나쁩니다.

SELECT Id 
FROM ( 
    SELECT ROW_NUMBER() OVER (ORDER BY Name) AS RowNum, Id 
    FROM dbo.Person
    WHERE CONTAINS(Name, '"John" AND "Smith"') ) AS RowConstrainedResult 
WHERE RowNum >= 0 AND RowNum < 11 
ORDER BY RowNum

완료하는 데 1.5 분 이상 걸립니다!

어떤 아이디어?

느린 계획

느린

빠른 계획

빠른


두 번째 쿼리를로 변경하면 어떻게됩니까 SELECT TOP 10 * .... ORDER BY Name?
Lamak

인덱스 IX_PersonSearch ...는 어떤 열에서 만들어 집니까? 테이블에서 *를 선택하고 사용 된 인덱스에 모든 출력 열이 포함되어 있지 않기 때문에 키 조회가 발생합니다. 필요한 열만 선택한 다음 인덱스 열이 아닌 포함 된 열로 클러스터되지 않은 인덱스에 포함시켜야한다고 생각합니다.
Marcel N.

테이블에 인덱스를 게시 할 수 있습니까 (스크립트 작성)?

3
ID는 항상 모든 비 클러스터형 인덱스에 포함됩니다. 이것은 SQL Server가 ID별로 키 조회를 수행 할 수있는 방법입니다.
usr

1
내가 언급하지 않은 것 : CONTAINS 대신 LIKE로 동일한 쿼리를 수행하면 빠릅니다. (Paginated or not)

답변:


7

그냥 원하는 TOP 10이름으로 주문 그것의 인덱스 아래로 빠른 작업을 할 것이다 생각하는 name순서로 각 행이 일치하는지 살펴 CONTAINS(Name, '"John" AND "Smith"') )술어를.

아마도 필요한 10 개의 일치 항목을 찾는 데 더 많은 행이 필요하며이 카디널리티 문제는 키 조회 수에 따라 복잡해집니다.

빠른 해킹은을 변경하는 것이 계획을 사용하여 중지 ORDER BYORDER BY Name + ''사용하여 비록 CONTAINSTABLE와 함께 FORCE ORDER작업도해야한다.


3

이것은 고전적인 선택성 오판과 같습니다. 쿼리의 "드라이버"가 통계로 보강 할 수없는 전체 텍스트 검색이기 때문에 수행 할 수있는 작업이 확실하지 않습니다.

where contains술어를 inner join containstable( CONTAINSTABLE )에 다시 작성하고 결합 순서 힌트를 적용하여 계획의 형태를 강제하십시오.

유지 관리 문제가 있기 때문에 완벽한 솔루션은 아니지만 다른 방법으로는 볼 수 없습니다.


답변 주셔서 감사합니다, 나는 그것을 시도했다. 동일한 결과 : 페이지 매김을 사용하지 않으면 쿼리가 실제로 빠릅니다. 페이지 매김이 갑자기 다시 느려집니다 : /

좋아, 계획을 이미지와 쿼리로 게시 할 수 있습니까? 우리가 아직 원하는 모양을 생성하지 못했다고 생각합니다.
usr

3

나는 문제를 해결했다.

내가 질문에서 말했듯이 모든 열 + 각 열에 대한 통계가 표시되었습니다. (레거시 LIKE 쿼리로 인해) 모든 indizes 및 통계를 제거하고 전체 텍스트 검색 및 추가 기능을 추가하여 쿼리 속도가 정말 빨라졌습니다.

동행으로 ​​인해 다른 실행 계획이 도출 된 것 같습니다.

도와 주셔서 감사합니다!


1
인덱스를 완전히 삭제하는 것은 인덱스가 사용되는 것을 막는 한 가지 방법입니다.
Martin Smith
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.