실행하는 데 약 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?
다른 실행 계획이 어떤 힌트를 제공하지 않습니까? –
나는 그것들을 잘 읽지는 못하지만, 조인에 의해 생성 된 서브 세트뿐만 아니라 b.BrandId를 사용할 때 전체 Brands 테이블에 십자가가 적용되는 것 같습니다. – Magpie
가능한 경우 나는 장님입니다. 하지만 두 번째 쿼리에서 'cah'별칭을 선언 한 위치는 어디입니까? – Devart