Mục đích chính của việc sử dụng CROSS ỨNG DỤNG là gì?
Tôi đã đọc (mơ hồ, thông qua các bài đăng trên Internet) cross apply
có thể hiệu quả hơn khi chọn qua các tập dữ liệu lớn nếu bạn đang phân vùng. (Paging xuất hiện trong tâm trí)
Tôi cũng biết rằng CROSS APPLY
không yêu cầu UDF là bàn bên phải.
Trong hầu hết INNER JOIN
các truy vấn (mối quan hệ một-nhiều), tôi có thể viết lại chúng để sử dụng CROSS APPLY
, nhưng chúng luôn cung cấp cho tôi các kế hoạch thực hiện tương đương.
Bất cứ ai có thể cho tôi một ví dụ tốt về khi nào CROSS APPLY
làm cho một sự khác biệt trong những trường hợp INNER JOIN
sẽ làm việc là tốt?
Biên tập:
Đây là một ví dụ tầm thường, trong đó các kế hoạch thực hiện hoàn toàn giống nhau. (Chỉ cho tôi một nơi chúng khác nhau và nơi cross apply
nhanh hơn / hiệu quả hơn)
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
có cách sử dụng rõ ràng trong việc cho phép một tập hợp phụ thuộc vào một tập hợp khác (không giống như JOIN
toán tử), nhưng điều đó không đi kèm với chi phí: nó hoạt động giống như một hàm hoạt động trên mỗi thành viên của tập hợp bên trái , do đó, theo thuật ngữ của SQL Server luôn luôn thực hiện một Loop Join
, mà hầu như không bao giờ là cách tốt nhất để tham gia các bộ. Vì vậy, sử dụng APPLY
khi bạn cần, nhưng đừng lạm dụng nó JOIN
.