実行するのに約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
しかし、私はちょうどクエリは今だけ実行するように2秒かかるCROSSが..適用
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
用から、私はBrandIdを取得し、テーブルを変更した場合。私がdbo.Brand b ON cah.RepresentedByBrandId = b.BrandId
に参加するとき、私はそれらが同じであると期待します。
誰かが巨大なパフォーマンスの違いを説明できますか?
UPDATE
CROSS私はah.RepresentedByBrandIdを使用するときに私はb.BrandId全体AccountHandlerテーブルを使用する場合、全ブランドのテーブル上で実行されて適用されるため、違いがあります。 AccountHandlerテーブルはかなり小さくなっています。
しかし、私はCROSS APPLYが1つのレコードであるJOINの結果だけで動作することを期待していました。これは可能ですか、私は理解されていないクロスCROSSが適用されますか?
異なる実行計画には何のヒントもありませんか? –
私はそれらを読んでうまくいけませんが、それはb.BrandIdを使用しているときにブランド全体のテーブルにクロス・アプリケーションを実行しているようですが、結合によって作成されたサブセットではない – Magpie
可能です。しかし、2番目のクエリで 'cah'エイリアスが宣言された場所はどこですか? – Devart