2016-11-30 1 views
3

Ich habe diese SQL-Abfrage. Ich weiß jetzt, was es zurückgibt, kann aber nicht verstehen, wie Server es analysiert und Schritt für Schritt ausführt. Ich möchte die Prinzipien der Arbeit in der tiefen Ebene verstehen, was auf dem Server läuft, wenn Sie den Befehl sql ausführen, wie es in jeder Zeile vor dem Ergebnis der Rückgabe iteriert.Was passiert auf SQL-Server, wenn Sie diesen SQL-Befehl ausführen

enter image description here

Ich habe users und friends Tabelle, in letzter friend_id und user_id Kombination, beide sind IDs der Nutzer.

select u.id,f.user_id, f.friend_id from friends f 
    INNER JOIN users u on (u.id = f.friend_id or u.id = f.user_id) 
    where f.user_id = 72 or f.friend_id = 72 
  • Wie kann ich erklären, was in jedem Schritt dieser Abfrage ist hier los?
  • Wie verhält es sich in jedem Schritt?
  • Wie OR Operator in jedem Schritt hier verhält?
  • überprüft es beide Anweisungen von OR Operator in jedem Schritt oder Abfrage oder z. in der ersten Iteration verbindet sich mit friend_id dann mit user_id.
+1

Es würde sich lohnen, das falsche Tag zu entfernen. Ist das MySQL oder SQL Server? –

+0

Hat MySQL einen ähnlichen Ausführungsplan wie SQL Server? –

+0

Ich habe EXPLAIN-Befehl verwendet, aber es ist nicht das, was ich suche, ich muss die Prinzipien der Arbeit Select-Abfrage verstehen. Wie funktioniert es, oder kompilieren. –

Antwort

2

Ohne einen Abfrage-Plan ich nur eine Vermutung machen, wie der Motor möglicherweise Ihre Abfrage ausführen kann, ich hoffe, es hilft:

Erster Schritt - ab:

Wenn Sie einen Index Für die where-Spalten (user_id, user_id) kann eine Indexsuche in Ihrer freunde-Tabelle mit den Bedingungen ausgeführt werden, um die Ergebnisse zu begrenzen, die später im Ausführungsplan ausgewertet werden müssen. Wenn Sie keinen Index haben, kann ein Tabellenscan durchgeführt werden.

Ihre Anfrage würde alle Zeilen aus der Freunde-Tabelle auswählen, wo user_id oder friend_id bis 72.

OR gleich ist, bedeutet hier, dass nur eine Bedingung erfüllt sein muss, um die Zeile in den Datenstrom von Zeilen hinzugefügt werden von Freunden.

2. Schritt - JOIN:

Nach den Freunden Zeilen gefunden anwenden das Prädikat wo die Verarbeitung tatsächlich kommen würde beginnen. Abhängig von den Tabellenstatistiken und den Abfragekosten kann die Engine einen Join mit Verschachtelungsschleife durchführen, bei dem jede Zeile von Freunden gegen Benutzer ausgewertet wird. Es könnte auch eine Hash-Tabelle für eine Tabelle erstellen und jede Zeile aus der anderen Tabelle mit der Hash-Schlüsselfunktion untersuchen. Auf diese Weise können die IDs zwischen Ihren beiden Tabellen (Freunde und Benutzer) angepasst werden.

Die ON definiert, welche Spalten zu vergleichen sind.

Betrachten wir den Fall einer Nested-Loop-Verknüpfung, die leichter zu verstehen ist. Dieser Join-Typ durchläuft beide Datenströme (Freunde und Benutzer), die reihenweise miteinander verbunden sind, und wertet jede Zeile aus.

In Ihrer Abfrage wird es die U.id gegen Friend_id vergleichen. Wenn diese Bedingung den Wert true zurückgibt, wird der Join erfüllt und die Engine kombiniert die übereinstimmende Zeile aus den Tabellenfreunden und Benutzern zur weiteren Verarbeitung.Wenn die erste Bedingung von ON falsch oder unbekannt ist, wertet die Engine die zweite Bedingung user_id aus. True erfüllt die Joins, false oder unknown bedeutet, dass die Zeile nicht übereinstimmt, daher wird sie nicht zurückgegeben, da in diesem Fall beide Bedingungen fehlschlagen würden.

3. Schritt - SELECT:

Nachdem die Tabellen der Motor die Daten alle Bedürfnisse hat verbunden sind, es um endlich die die Spalten der Rückkehr SELECT Anweisung ausführen Sie es gefragt haben.

Verwandte Themen