2013-07-10 3 views
7

실행하는 데 약 30 초가 걸리는 SQL 쿼리가 있는데이 레코드는 1 레코드를 반환합니다. CROSS APPLY에 사용 된 기능은이 레코드의 BrandId를 사용하면 즉시 실행됩니다. 난 그냥 테이블을 변경하는 경우CROSS APPLY 성능 차이

SELECT 
    b.BrandId, 
    b.Name, 
    ah.Type, 
    c.ContactEmails, 
    c.ContactNumbers, 
    c.ContactLinks 
FROM 
    @IdsToFilterBy ids 
JOIN dbo.AccountHandler ah ON ah.AccountHandlerId = ids.Id 
JOIN dbo.Brand b ON ah.RepresentedByBrandId = b.BrandId 
CROSS APPLY dbo.[fn_GetBrandContactDetails](b.BrandId) AS c 

그러나 나는

SELECT 
    b.BrandId, 
    b.Name, 
    ah.Type, 
    c.ContactEmails, 
    c.ContactNumbers, 
    c.ContactLinks 
FROM 
    @IdsToFilterBy ids 
JOIN dbo.AccountHandler ah ON ah.AccountHandlerId = ids.Id 
JOIN dbo.Brand b ON ah.RepresentedByBrandId = b.BrandId 
CROSS APPLY dbo.[fn_GetBrandContactDetails](ah.RepresentedByBrandId) AS c <-- change here 

쿼리는 이제 실행하는 데 2 ​​초 소요 .. 적용하여 십자가에서 BrandId를 얻을. 내가 dbo.Brand b ON cah.RepresentedByBrandId = b.BrandId에 가입 할 때 나는 그들이 똑같을 것을 기대할 것이다.

누군가 큰 성능 차이를 설명 할 수 있습니까? 내가 ah.RepresentedByBrandId를 사용할 때 내가 b.BrandId 전체의 AccountHandler 테이블을 사용할 때 CROSS 전체 브랜드 테이블에서 실행되고 적용되기 때문에

UPDATE

의 차이입니다. AccountHandler 테이블은 상당히 작습니다.

그러나 CROSS APPLY가 JOIN의 결과 중 하나 인 1 개의 레코드에서만 실행되기를 기대했습니다. 이것이 가능한가요, 아니면 이해가 안되나요? CROSS APPLY?

+2

다른 실행 계획이 어떤 힌트를 제공하지 않습니까? –

+0

나는 그것들을 잘 읽지는 못하지만, 조인에 의해 생성 된 서브 세트뿐만 아니라 b.BrandId를 사용할 때 전체 Brands 테이블에 십자가가 적용되는 것 같습니다. – Magpie

+0

가능한 경우 나는 장님입니다. 하지만 두 번째 쿼리에서 'cah'별칭을 선언 한 위치는 어디입니까? – Devart

답변

14

발견. (가) (가) 내가 옵션을 (강제 ORDER)이 지금 즉각적으로보고 실행

SELECT 
    b.BrandId, 
    b.Name, 
    ah.Type, 
    c.ContactEmails, 
    c.ContactNumbers, 
    c.ContactLinks 
FROM 
    @IdsToFilterBy ids 
JOIN dbo.AccountHandler ah ON ah.AccountHandlerId = ids.Id 
JOIN dbo.Brand b ON ah.RepresentedByBrandId = b.BrandId 
CROSS APPLY dbo.[fn_GetBrandContactDetails](b.BrandId) AS c 
OPTION (FORCE ORDER) 

을 사용 JOINS하기 전에 전체 테이블에 조인하지에서

은 결과의 서브 세트에서 실행되도록 CROSS 적용을 강제로 실행 계획은 함수가 오직 하나의 결과 만 호출되고 전체 db 테이블은 호출되지 않습니다.

+2

FORCE ORDER가 항상 도움이되는 것은 아니며 중간 테이블을 사용하여 "기본 쿼리"결과를 저장 한 다음 함수에 교차 적용을 적용해야했습니다. –

-1

나는 동일한 문제가있어서 CROSS APPLY 대신 OUTER APPLY를 사용하여 해결했습니다.