Mam zapytanie SQL, które trwa około 30 sekund, aby uruchomić, który zwraca 1 rekord. Funkcja używana w CROSS APPLY jest natychmiastowa po uruchomieniu z BrandId tego rekordu.CROSS APPLY różnica wydajności
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
Jednak jeśli po prostu zmienić tabelę uzyskać BrandId od do krzyża ZASTOSOWANIA ..
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
zapytanie teraz zajmuje tylko 2 sekundy, aby uruchomić. Gdy dołączę do dbo.Brand b ON cah.RepresentedByBrandId = b.BrandId
, oczekuję, że będą takie same.
Czy ktoś może wyjaśnić, dlaczego ogromna różnica w wydajności?
UPDATE
Różnica polega na tym, ponieważ CROSS APPLY działa na całej tabeli Brand kiedy używam b.BrandId i cały stół AccountHandler kiedy używam ah.RepresentedByBrandId. Tabela AccountHandler jest znacznie mniejsza.
Spodziewałem się jednak, że CROSS APPLY uruchomi się właśnie na wynikach JOIN, które są jednym rekordem. Czy to jest możliwe, czy też tęsknię za rozumieniem CROSS APPLY?
Czy inny plan wykonania nie zawiera żadnych wskazówek? –
Nie jestem dobry w ich odczytywaniu, ale wygląda na to, że uruchamia się krzyżyk dla całej tabeli Brands, kiedy używam b.BrandId, a nie tylko podzbioru utworzonego przez join – Magpie
Możliwe, że jestem ślepy. Ale gdzie zadeklarowano alias "cah" w drugim zapytaniu? – Devart