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 applycó 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 APPLYkhông yêu cầu UDF là bàn bên phải.
Trong hầu hết INNER JOINcá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 APPLYlàm cho một sự khác biệt trong những trường hợp INNER JOINsẽ 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 applynhanh 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 APPLYcó 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ư JOINtoá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 APPLYkhi bạn cần, nhưng đừng lạm dụng nó JOIN.
