1151 Stimmen

Wann sollte ich CROSS APPLY statt INNER JOIN verwenden?

Was ist der Hauptzweck der Verwendung von CROSS APPLY ?

Ich habe (vage, durch Beiträge im Internet) gelesen, dass cross apply kann bei der Auswahl über große Datenmengen effizienter sein, wenn Sie diese partitionieren. (Paging kommt mir in den Sinn)

Ich weiß auch, dass CROSS APPLY erfordert keine UDF als rechte Tabelle.

In den meisten INNER JOIN Abfragen (Eins-zu-Viel-Beziehungen), könnte ich sie umschreiben, um die CROSS APPLY aber sie geben mir immer gleichwertige Ausführungspläne.

Kann mir jemand ein gutes Beispiel dafür nennen, wann CROSS APPLY macht einen Unterschied in den Fällen, in denen INNER JOIN auch funktionieren wird?


Editar:

Hier ist ein triviales Beispiel, bei dem die Ausführungspläne genau gleich sind. (Zeigen Sie mir einen, wo sie sich unterscheiden und wo cross apply schneller/effizienter ist)

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

8voto

Shanid Punkte 507

Hier ist ein Artikel, der alles erklärt, mit ihren Leistungsunterschieden und Verwendung über JOINS.

SQL Server CROSS APPLY und OUTER APPLY über JOINS

Wie in diesem Artikel vorgeschlagen, gibt es keinen Leistungsunterschied zwischen ihnen für normale Join-Vorgänge (INNER AND CROSS).

enter image description here

Der Unterschied in der Verwendung ergibt sich, wenn Sie eine Abfrage wie diese durchführen müssen:

CREATE FUNCTION dbo.fn_GetAllEmployeeOfADepartment(@DeptID AS INT)  
RETURNS TABLE 
AS 
RETURN 
   ( 
   SELECT * FROM Employee E 
   WHERE E.DepartmentID = @DeptID 
   ) 
GO 

SELECT * FROM Department D 
CROSS APPLY dbo.fn_GetAllEmployeeOfADepartment(D.DepartmentID)

Das heißt, wenn man mit der Funktion zu tun hat. Dies kann nicht mit INNER JOIN gemacht werden, was zu dem Fehler führen würde "Der mehrteilige Bezeichner "D.DepartmentID" konnte nicht gebunden werden." Hier wird der Wert beim Lesen jeder Zeile an die Funktion übergeben. Hört sich gut an :)

5voto

shahkalpesh Punkte 32505

Ich denke, es sollte Lesbarkeit sein ;)

CROSS APPLY wird für die Leser etwas eindeutig sein, um ihnen zu sagen, dass eine UDF verwendet wird, die auf jede Zeile der Tabelle auf der linken Seite angewendet wird.

Natürlich gibt es auch andere Einschränkungen, bei denen ein CROSS APPLY besser geeignet ist als ein JOIN, wie andere Freunde oben geschrieben haben.

5voto

Raf Punkte 530

Das Wesen des APPLY-Operators besteht darin, eine Korrelation zwischen der linken und rechten Seite des Operators in der FROM-Klausel zu ermöglichen.

Im Gegensatz zu JOIN ist die Korrelation zwischen den Eingaben nicht erlaubt.

Wenn wir über die Korrelation im APPLY-Operator sprechen, meine ich, dass wir auf der rechten Seite schreiben können:

  • eine abgeleitete Tabelle - als korrelierte Unterabfrage mit einem Alias
  • eine tabellenbewertete Funktion - eine konzeptionelle Ansicht mit Parametern, wobei sich der Parameter auf die linke Seite beziehen kann

Beide können mehrere Spalten und Zeilen zurückgeben.

3voto

mrmillsy Punkte 475

Dies ist vielleicht eine alte Frage, aber ich bin immer noch begeistert von der Fähigkeit von CROSS APPLY, die Wiederverwendung von Logik zu vereinfachen und einen "Verkettungs"-Mechanismus für Ergebnisse zu bieten.

Nachfolgend finden Sie ein einfaches Beispiel dafür, wie Sie mit CROSS APPLY komplexe logische Operationen mit Ihrem Datensatz durchführen können, ohne dass die Dinge unübersichtlich werden. Es ist nicht schwer, von hier aus komplexere Berechnungen zu extrapolieren.

http://sqlfiddle.com/#!3/23862/2

0voto

Zeek2 Punkte 331

Wir verwenden CROSS APPLY um eine Tabelle zu aktualisieren mit JSON aus einer anderen Tabelle (Aktualisierungsanforderung) - Joins werden dafür nicht funktionieren, da wir OPENJSON verwenden, um den Inhalt des JSON zu lesen, und OPENJSON ist eine "tabellenwertige Funktion".

Ich wollte hier eine vereinfachte Version eines unserer UPDATE-Befehle als Beispiel anführen, aber selbst in vereinfachter Form ist er ziemlich umfangreich und übermäßig komplex für ein Beispiel. Daher muss diese stark vereinfachte "Skizze" nur eines Teils des Befehls genügen:

SELECT  
       r.UserRequestId,
       j.xxxx AS xxxx,
FROM  RequestTable as r WITH (NOLOCK)
   CROSS APPLY
      OPENJSON(r.JSON, '$.requesttype.recordtype')
      WITH(
             r.userrequestid nvarchar(50) '$.userrequestid',
             j.xxx nvarchar(20) '$.xxx
           )j
       WHERE r.Id > @MaxRequestId
          and ... etc. ....

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X