Was ist der Hauptzweck von CROSS APPLY ?
Ich habe (vage durch Beiträge im Internet) gelesen, dass cross apply
es effizienter sein kann, wenn Sie über große Datenmengen auswählen, wenn Sie partitionieren. (Paging kommt mir in den Sinn)
Ich weiß auch, dass CROSS APPLY
keine UDF als richtige Tabelle erforderlich ist.
In den meisten INNER JOIN
Abfragen (Eins-zu-Viele-Beziehungen) konnte ich sie zur Verwendung umschreiben CROSS APPLY
, aber sie geben mir immer gleichwertige Ausführungspläne.
Kann mir jemand ein gutes Beispiel geben, wann CROSS APPLY
es in den Fällen, in denen INNER JOIN
es auch funktioniert, einen Unterschied macht ?
Bearbeiten:
Hier ist ein einfaches Beispiel, bei dem die Ausführungspläne genau gleich sind. (Zeigen Sie mir, wo sie sich unterscheiden und wo sie cross apply
schneller / effizienter sind)
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
quelle
CROSS APPLY
hat seine offensichtliche Verwendung darin, zuzulassen, dass ein Satz von einem anderen abhängt (im Gegensatz zumJOIN
Operator), aber das ist nicht ohne Kosten: Es verhält sich wie eine Funktion, die über jedes Mitglied des linken Satzes ausgeführt wird, also in SQL Server-Begriffen Führen Sie immer eine ausLoop Join
, was fast nie der beste Weg ist, um Sets zu verbinden. VerwendenAPPLY
Sie es also, wenn Sie es brauchen, aber verwenden Sie es nicht zu starkJOIN
.Antworten:
Im Artikel in meinem Blog finden Sie einen detaillierten Leistungsvergleich:
INNER JOIN
vs.CROSS APPLY
CROSS APPLY
funktioniert besser bei Dingen, die keinen einfachenJOIN
Zustand haben.Dieser wählt die
3
letzten Datensätze aust2
für jeden Datensatz aust1
:Es kann nicht einfach mit einer
INNER JOIN
Bedingung formuliert werden.Sie könnten wahrscheinlich so etwas mit
CTE
der Funktion 's' und 'window' machen:, aber das ist weniger lesbar und wahrscheinlich weniger effizient.
Aktualisieren:
Gerade nachgeguckt.
master
ist eine Tabelle von etwa20,000,000
Aufzeichnungen mit einemPRIMARY KEY
aufid
.Diese Abfrage:
läuft fast
30
Sekunden, während dieser:ist sofort.
quelle
TVF
mit anINNER JOIN
?CROSS APPLY
gefragt , sondern nach dem Zeitpunkt der AuswahlINNER JOIN
, wann dies auch funktionieren würde.lateral join
in Standard (ANSI) SQL bezeichnet wirdcross apply
Manchmal können Sie Dinge tun, mit denen Sie nichts anfangen könneninner join
.Beispiel (ein Syntaxfehler):
Dies ist ein Syntaxfehler , da
inner join
Tabellenfunktionen bei Verwendung mit nur Variablen oder Konstanten als Parameter verwenden können. (Das heißt, der Tabellenfunktionsparameter kann nicht von der Spalte einer anderen Tabelle abhängen.)Jedoch:
Das ist legal.
Edit: Oder alternativ kürzere Syntax: (von ErikE)
Bearbeiten:
Hinweis: Informix 12.10 xC2 + verfügt über seitlich abgeleitete Tabellen und Postgresql (9.3+) über seitliche Unterabfragen , die auf ähnliche Weise verwendet werden können.
quelle
SELECT
benötigt in derCROSS APPLY
. Bitte versuchen Sie esCROSS APPLY dbo.myTableFun(O.name) F
.Angenommen, Sie haben zwei Tabellen.
MASTER TABLE
DETAILS TABELLE
Es gibt viele Situationen , in denen wir ersetzen müssen
INNER JOIN
mitCROSS APPLY
.1. Verbinden Sie zwei Tabellen basierend auf den
TOP n
ErgebnissenÜberlegen Sie, ob wir müssen wählen
Id
undName
ausMaster
und die letzten beiden Tage , für jedenId
ausDetails table
.Die obige Abfrage generiert das folgende Ergebnis.
Es wurden Ergebnisse für die letzten beiden Daten mit den letzten beiden Daten generiert
Id
und diese Datensätze dann nur in der äußeren Abfrage am verknüpftId
, was falsch ist. Dies sollte sowohlIds
1 als auch 2 zurückgeben, aber es wird nur 1 zurückgegeben, da 1 die letzten beiden Daten hat. Um dies zu erreichen, müssen wir verwendenCROSS APPLY
.und bildet das folgende Ergebnis.
So funktioniert das. Die Abfrage im Inneren
CROSS APPLY
kann auf die äußere Tabelle verweisen, woINNER JOIN
dies nicht möglich ist (es wird ein Kompilierungsfehler ausgelöst). Wenn die letzten zwei Tage , zu finden, erfolgt das Fügen im Inneren getanCROSS APPLY
dhWHERE M.ID=D.ID
.2. Wenn wir
INNER JOIN
Funktionalität mit Funktionen benötigen .CROSS APPLY
kann als Ersatz verwendet werden,INNER JOIN
wenn wir Ergebnisse ausMaster
Tabelle und a erhalten müssenfunction
.Und hier ist die Funktion
welches das folgende Ergebnis erzeugte
ZUSÄTZLICHER VORTEIL DER KREUZANWENDUNG
APPLY
kann als Ersatz für verwendet werdenUNPIVOT
. EntwederCROSS APPLY
oderOUTER APPLY
kann hier verwendet werden, die austauschbar sind.Angenommen, Sie haben die folgende Tabelle (benannt
MYTABLE
).Die Abfrage ist unten.
das bringt dir das Ergebnis
quelle
Es scheint mir, dass CROSS APPLY eine bestimmte Lücke füllen kann, wenn mit berechneten Feldern in komplexen / verschachtelten Abfragen gearbeitet wird, und diese einfacher und lesbarer machen kann.
Einfaches Beispiel: Sie haben ein DoB und möchten mehrere altersbezogene Felder anzeigen, die auch auf anderen Datenquellen (z. B. Beschäftigung) wie Age, AgeGroup, AgeAtHiring, MinimumRetirementDate usw. zur Verwendung in Ihrer Endbenutzeranwendung basieren (Zum Beispiel Excel PivotTables).
Die Möglichkeiten sind begrenzt und selten elegant:
JOIN-Unterabfragen können keine neuen Werte in das Dataset einführen, die auf Daten in der übergeordneten Abfrage basieren (sie müssen für sich allein stehen).
UDFs sind ordentlich, aber langsam, da sie dazu neigen, parallele Operationen zu verhindern. Und eine separate Einheit zu sein, kann eine gute (weniger Code) oder eine schlechte (wo ist der Code) Sache sein.
Verbindungstabellen. Manchmal können sie funktionieren, aber schon bald schließen Sie sich Unterabfragen mit Tonnen von UNIONs an. Großes Chaos.
Erstellen Sie eine weitere Einzelansicht, vorausgesetzt, Ihre Berechnungen erfordern keine Daten, die in der Mitte Ihrer Hauptabfrage abgerufen wurden.
Zwischentabellen. Ja ... das funktioniert normalerweise und ist oft eine gute Option, da sie indiziert und schnell sind. Die Leistung kann jedoch auch sinken, weil UPDATE-Anweisungen nicht parallel sind und es nicht möglich ist, Formeln zu kaskadieren (Ergebnisse wiederzuverwenden), um mehrere Felder innerhalb der zu aktualisieren gleiche Aussage. Und manchmal möchten Sie es einfach vorziehen, Dinge in einem Durchgang zu erledigen.
Verschachtelungsabfragen. Ja, Sie können Ihre gesamte Abfrage jederzeit in Klammern setzen und als Unterabfrage verwenden, mit der Sie Quelldaten und berechnete Felder gleichermaßen bearbeiten können. Aber Sie können dies nur so oft tun, bevor es hässlich wird. Sehr hässlich.
Code wiederholen. Was ist der größte Wert von 3 langen Anweisungen (CASE ... ELSE ... END)? Das wird lesbar sein!
Habe ich etwas verpasst? Wahrscheinlich, also zögern Sie nicht zu kommentieren. Aber hey, CROSS APPLY ist in solchen Situationen wie ein Glücksfall: Sie fügen einfach ein einfaches hinzu
CROSS APPLY (select tbl.value + 1 as someFormula) as crossTbl
und voilà hinzu! Ihr neues Feld ist jetzt praktisch einsatzbereit, so wie es in Ihren Quelldaten immer vorhanden war.Durch CROSS APPLY eingeführte Werte können ...
CROSS APPLY (select crossTbl.someFormula + 1 as someMoreFormula) as crossTbl2
Verdammt, es gibt nichts, was sie nicht können!
quelle
Cross Apply funktioniert auch gut mit einem XML-Feld. Wenn Sie Knotenwerte in Kombination mit anderen Feldern auswählen möchten.
Zum Beispiel, wenn Sie eine Tabelle mit XML haben
Verwenden der Abfrage
Gibt ein Ergebnis zurück
quelle
Dies wurde technisch bereits sehr gut beantwortet, aber lassen Sie mich ein konkretes Beispiel dafür geben, wie äußerst nützlich es ist:
Nehmen wir an, Sie haben zwei Tabellen: Kunde und Bestellung. Kunden haben viele Bestellungen.
Ich möchte eine Ansicht erstellen, die Details zu Kunden und der letzten Bestellung enthält, die sie getätigt haben. Mit nur JOINS würde dies einige Self-Joins und Aggregationen erfordern, was nicht schön ist. Aber mit Cross Apply ist es super einfach:
quelle
Cross Apply kann verwendet werden, um Unterabfragen zu ersetzen, bei denen Sie eine Spalte der Unterabfrage benötigen
Unterabfrage
Hier kann ich die Spalten der Firmentabelle nicht mit cross apply auswählen
quelle
Ich denke es sollte Lesbarkeit sein;)
CROSS APPLY ist für Leser etwas Einzigartiges, um ihnen mitzuteilen, dass eine UDF verwendet wird, die auf jede Zeile aus der Tabelle links angewendet wird.
Natürlich gibt es andere Einschränkungen, bei denen eine CROSS APPLY besser verwendet wird als JOIN, die andere Freunde oben gepostet haben.
quelle
Hier ist ein Artikel, der alles erklärt, mit dem Leistungsunterschied und der 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 Verknüpfungsvorgänge (INNER AND CROSS).
Der Nutzungsunterschied tritt auf, wenn Sie eine Abfrage wie folgt ausführen müssen:
Das heißt, wenn Sie sich auf die Funktion beziehen müssen. Dies kann nicht mit INNER JOIN durchgeführt werden, was den Fehler "Die mehrteilige Kennung" D.DepartmentID "konnte nicht gebunden werden." Hier wird der Wert beim Lesen jeder Zeile an die Funktion übergeben. Klingt cool für mich. :) :)
quelle
Ich bin mir nicht sicher, ob dies ein Grund für die Verwendung von Cross Apply im Vergleich zu Inner Join ist, aber diese Abfrage wurde für mich in einem Forumbeitrag mit Cross Apply beantwortet. Daher bin ich mir nicht sicher, ob es eine gleichwertige Methode mit Inner Join gibt:
WIE BEGINNEN
ENDE
quelle
Der APPLY-Operator besteht im Wesentlichen darin, eine Korrelation zwischen der linken und der rechten Seite des Operators in der FROM-Klausel zuzulassen.
Im Gegensatz zu JOIN ist die Korrelation zwischen Eingaben nicht zulässig.
Wenn ich über die Korrelation im APPLY-Operator spreche, meine ich auf der rechten Seite, die wir setzen können:
Beide können mehrere Spalten und Zeilen zurückgeben.
quelle
Dies ist vielleicht eine alte Frage, aber ich liebe immer noch die Fähigkeit von CROSS APPLY, die Wiederverwendung von Logik zu vereinfachen und einen "Verkettungs" -Mechanismus für Ergebnisse bereitzustellen.
Im Folgenden habe ich eine SQL-Geige bereitgestellt, die ein einfaches Beispiel dafür zeigt, wie Sie mit CROSS APPLY komplexe logische Operationen an Ihrem Datensatz ausführen können, ohne dass die Dinge chaotisch werden. Es ist nicht schwer, hier komplexere Berechnungen zu extrapolieren.
http://sqlfiddle.com/#!3/23862/2
quelle
Während die meisten Abfragen, die CROSS APPLY verwenden, mit einem INNER JOIN neu geschrieben werden können, kann CROSS APPLY einen besseren Ausführungsplan und eine bessere Leistung liefern, da dies die Verknüpfung der Gruppe noch vor dem Join einschränken kann.
Von hier gestohlen
quelle