วัตถุประสงค์หลักในการใช้CROSS APPLYคืออะไร
ฉันได้อ่าน (ผ่านทางโพสต์บนอินเทอร์เน็ต) ที่cross apply
มีประสิทธิภาพมากขึ้นเมื่อเลือกผ่านชุดข้อมูลขนาดใหญ่หากคุณแบ่งพาร์ติชัน (เพจมาถึงใจ)
ฉันก็รู้ว่าCROSS APPLY
ไม่จำเป็นต้องมี UDF เป็นตารางขวา
ในINNER JOIN
ข้อความค้นหาส่วนใหญ่(ความสัมพันธ์แบบหนึ่งต่อหลายคน) ฉันสามารถเขียนใหม่เพื่อใช้งาน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
แต่ไม่ได้มีการใช้มากเกินไปมันกับ