2008-09-05 4 views
4

누구든지이 행동을 설명 할 수 있습니까? 이 쿼리를 실행하면내부 및 왼쪽 조인으로 인해 SQL 쿼리가 느려 집니까?

:

select * 
from TblA 
left join freetexttable (TblB, *, 'query') on TblA.ID = [Key] 
inner join DifferentDbCatalog.dbo.TblC on TblA.ID = TblC.TblAID 

그것은 아주 아주 아주 느린 것입니다.

왼쪽 조인 대신 두 개의 내부 조인을 사용하도록 쿼리를 변경하면 매우 빠릅니다. 내부 조인 대신 두 개의 왼쪽 조인을 사용하도록 변경하면 매우 빠릅니다.

freetextable 대신 SQL 테이블 변수를 사용하는 경우에도 이와 동일한 문제가 발생할 수 있습니다.

성능 문제는 테이블 변수 (또는 freetextable)와 다른 데이터베이스 카탈로그에 하나가 내부 조인에 있고 다른 하나가 왼쪽 조인에있는 테이블을 가질 때마다 발생합니다.

왜 속도가 느린 지 또는 속도를 높이는 방법을 아는 사람이 있습니까?

답변

0

조인을 수행하는 데 사용하는 필드를 인덱싱하십시오.

일반적으로 참조되는 foreign 또는 candidate keys에 색인을 할당하는 것이 좋습니다.

3

"실제 실행 계획 표시"옵션을 켜고 속도 저하의 원인을 자세히 살펴보십시오. (각 조인 위로 마우스를 가져 가면 세부 정보를 볼 수 있습니다.) 테이블 검색이 아닌 인덱스 찾기가 필요합니다.

나는 SQL이 조인 중 하나를 수행하기 위해 한 테이블에서 모든 것을 메모리로 가져 오도록 강요 받고 있다고 가정합니다. 때로는 테이블을 조인하는 순서를 뒤바꾸는 것도 도움이 될 것입니다. 엄지

7

일반적인 규칙 외부 증가 INNER 는 감소 결과 세트의 행 수를 일으킬 조인 상태로 설정 한 결과의 행 수를 일으킬 조인이다. 물론 그 반대의 경우도 많지만 실제로는 그렇지 않은 것보다 더 많은 시나리오가있을 수 있습니다. 성능 향상을 위해 수행하려는 작업은 가능한 한 오랫동안 결과 집합 (작업 집합)의 크기를 가능한 작게 유지하는 것입니다.

두 조인 모두 첫 번째 테이블에서 일치하므로 순서를 변경해도 결과의 정확성에는 영향을주지 않습니다. 따라서, 당신은 아마 내부가 떠나기 전에 가입하고 싶지는 가입 ​​:

SELECT * 
FROM TblA 
INNER JOIN DifferentDbCatalog.dbo.TblC on TblA.ID = TblC.TblAID 
LEFT JOIN freetexttable (TblB, *, 'query') on TblA.ID = [Key] 

실제적인 문제로서, 쿼리 최적화 당신이 지정된 순서로하는 관계없이 빠른 옵션을 사용하여 컴파일 할만큼 똑똑해야한다 조인을 위해. 그러나 바보 쿼리 최적화 프로그램을 사용하고 쿼리 작업이 순서대로 수행되는 척하는 것이 좋습니다. 이것은 미래의 관리자가 테이블의 특성에 대한 잠재적 오류 또는 가정을 발견하는 데 도움이됩니다. 당신은 아마 아직도 각 쿼리에 사용되는 실행 계획을 검토 를 원하고 있습니다 있도록

최적화 물건을 다시 작성해야하기 때문에

, 이것은 아마도 완전히 당신이보고있는 동작을 설명하기에 충분하지 않습니다 앞에서 제안한대로 색인을 추가하십시오. 그러나 여전히 배우기에 좋은 원칙입니다.

0

임시 테이블에 freetexttable(TblB, *, 'query')을 넣으면 실행 계획에서 반복적으로 호출되는 경우 도움이 될 수 있습니다.

관련 문제