CROSS APPLYを使用する主な目的は何ですか?
私は(漠然と、インターネット上の投稿を通じて)、cross apply
パーティション分割している場合に大規模なデータセットを選択する場合により効率的な方法を読んだことがあります。(ページングが頭に浮かぶ)
またCROSS APPLY
、右のテーブルとしてUDFを必要としないことも知っています。
ほとんどのINNER JOIN
クエリ(1対多の関係)では、を使用するように書き換えることができましたCROSS APPLY
が、常に同等の実行プランが提供されます。
誰もが私がうまくいくような場合にCROSS APPLY
違いが出るときの良い例を私に教えてもらえINNER JOIN
ますか?
編集:
以下は、実行プランがまったく同じである簡単な例です。(それらが異なり、どこcross apply
がより速く/より効率的かを示してください)
create table Company (
companyId int identity(1,1)
, companyName varchar(100)
, zipcode varchar(10)
, constraint PK_Company primary key (companyId)
)
GO
create table Person (
personId int identity(1,1)
, personName varchar(100)
, companyId int
, constraint FK_Person_CompanyId foreign key (companyId) references dbo.Company(companyId)
, constraint PK_Person primary key (personId)
)
GO
insert Company
select 'ABC Company', '19808' union
select 'XYZ Company', '08534' union
select '123 Company', '10016'
insert Person
select 'Alan', 1 union
select 'Bobby', 1 union
select 'Chris', 1 union
select 'Xavier', 2 union
select 'Yoshi', 2 union
select 'Zambrano', 2 union
select 'Player 1', 3 union
select 'Player 2', 3 union
select 'Player 3', 3
/* using CROSS APPLY */
select *
from Person p
cross apply (
select *
from Company c
where p.companyid = c.companyId
) Czip
/* the equivalent query using INNER JOIN */
select *
from Person p
inner join Company c on p.companyid = c.companyId
CROSS APPLY
(JOIN
演算子とは異なり)セットが別のセットに依存することを許可することには明らかな使用法がありますが、それにはコストがかかりません:左のセットの各メンバーを操作する関数のように動作するため、SQL Serverでは常にを実行しLoop Join
ます。これは、ほとんどの場合、セットを結合する最良の方法ではありません。したがって、APPLY
必要なときに使用しますが、に対して過度に使用しないでくださいJOIN
。