2013-07-10 17 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 

しかし、私はちょうどクエリは今だけ実行するように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が適用されますか?

+2

異なる実行計画には何のヒントもありませんか? –

+0

私はそれらを読んでうまくいけませんが、それはb.BrandIdを使用しているときにブランド全体のテーブルにクロス・アプリケーションを実行しているようですが、結合によって作成されたサブセットではない – Magpie

+0

可能です。しかし、2番目のクエリで 'cah'エイリアスが宣言された場所はどこですか? – Devart

答えて

14

見つけました。私はOPTIONに(FORCEの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) 

を使用し参加する前、テーブル全体に合流していないから

は、結果のサブセット上で実行するためにCROSSを適用強制するには実行計画では、関数はdbテーブル全体ではなく、1つの結果に対してのみ呼び出されます。

+2

FORCE ORDERが必ずしも役立つとは限りません。私は中間テーブルを使用して "メインクエリ"の結果を保存し、関数にクロス適用する必要がありました。 –

-1

私は同じ問題を抱えていましたが、私はCROSS APPLYの代わりにOUTER APPLYを使用して解決しました。

関連する問題