2 Wählen Sie oder 1 Abfrage beitreten?

8

Ich habe 2 Tabellen:

Buch (ID, Titel, Alter) ---- & gt; 100 Millionen Zeilen

Autor (id, book_id, name, born) ---- & gt; 10 Millionen Zeilen

Nun, angenommen, ich hätte eine generische ID eines Buches. Ich muss diese Seite ausdrucken:

%Vor%

Also ... was ist der beste Weg, dies zu tun?

1) Einfach verbinden wie folgt:

%Vor%

2) Um den Join zu vermeiden, könnte ich 2 einfache Abfragen machen:

%Vor%

Was ist der effizienteste Weg?

    
xRobot 13.06.2010, 15:49
quelle

5 Antworten

8

Der erste. Es ist nur eine Hin- und Rückfahrt. Es erfordert ein wenig Verarbeitung, um die Zeilen der Autoren in eine kommagetrennte Liste zusammenzufassen, wie Sie wollen, aber das ist im Grunde Standardcode.

Separate verwandte Abfragen sind eine schlechte Angewohnheit, die Ihre Leistung schneller als die meisten Dinge töten wird.

    
cletus 13.06.2010 15:52
quelle
2

Die beste Option besteht darin, Geschwindigkeitstests auf Ihrem eigenen Server auszuführen. Abhängig davon, wie oft auf die verschiedenen Tabellen zugegriffen wird, kann beides schneller sein.

Dies wurde zuvor ausführlich beantwortet: LINKER VERBINDUNG vs. mehrere SELECT-Anweisungen

    
Aaron Harun 13.06.2010 15:56
quelle
1

Der erste, und vor allem, wenn Sie einen Index für author.book_id haben. Ein geschlossener Index wäre am besten, wenn Sie viele Autoren haben, Buch und es ist möglich, sonst würde ein non-closered Ihnen auch sehr helfen.

    
jweber 13.06.2010 16:01
quelle
1

Rundreise-Minimierung und Förderung von vernünftigen Ausführungsplänen sind die wichtigsten Punkte auf meiner Leistungsliste.

Wenn Sie eine Situation mit statischen Abhängigkeiten zwischen Feldern in einer Abfrage haben, die verhindern, dass das Optimierungsprogramm einen Index verwendet, dann führt das Aufteilen in separate Abfragen zu enormen Leistungssteigerungen, wenn Indizes verwendet werden und die Zeilenanzahl des Datasets steigt. Bei den meisten Datenbanktransportprotokollen entsprechen die zusätzlichen Ergebnismengen den zusätzlichen Roundtrips. Dies kann möglicherweise Auswirkungen auf die Leistung haben, wenn auf Daten regelmäßig über ein WAN zugegriffen wird. Fortunatly gibt es Möglichkeiten, Ihren Kuchen zu haben und es auch zu essen:

%Vor%

In Ihrem konkreten Beispiel würde ich # 1 mit einer Warnung wählen, um zu überlegen, was passieren würde, wenn für ein bestimmtes Buch keine Autoren in der Datei wären.

    
Einstein 13.06.2010 17:23
quelle
0

Ich weiß, dass es keine Überlegung sein sollte, aber die erste Abfrage gibt Ihnen ein Ergebnis zurück, das wie folgt lautet:

%Vor%

während das zweite Paar Ihnen ein Paar Ergebnismengen wie folgt zurückgibt:

%Vor%

und

%Vor%

Jeder Ansatz gibt die Daten auf andere Weise zurück. In diesem einfachen Beispiel wird die Wiederholung des Buchtitels nicht von Bedeutung sein, aber wenn Sie anstelle des Titels das erste Kapitel (sagen wir) zurückgeben würden, wäre dies weniger effizient, da es viele wiederholte Daten geben würde. Während der zweite Vorgang in der Datenbank länger dauern kann, ist es beim Senden dieser Daten über das Netzwerk möglicherweise schneller und effizienter.

Sie müssen Ihre tatsächlichen Ergebnisse testen und sehen, welche am besten funktioniert.

    
ChrisF 13.06.2010 16:01
quelle