Konzeptionelle Frage: Sind einzelne Abfragen schneller als Verknüpfungen? Oder: Soll ich versuchen, alle Informationen, die ich auf der Clientseite haben möchte, in einer SELECT-Anweisung zusammenzufassen, oder einfach so viele verwenden, wie es zweckmäßig erscheint?
TL; DR : Wenn meine verknüpfte Abfrage länger dauert als die Ausführung einzelner Abfragen, ist dies meine Schuld oder ist dies zu erwarten?
Erstens bin ich nicht sonderlich datenbanktauglich, daher kann es nur an mir liegen, aber ich habe festgestellt, dass es "oft" schneller ist, diese Informationen über mehrere Abfragen für einzelne Tabellen abzurufen (möglicherweise), wenn ich Informationen aus mehreren Tabellen abrufen muss eine einfache innere Verknüpfung enthalten) und patchen Sie die Daten auf der Clientseite, um zu versuchen, eine (komplexe) verknüpfte Abfrage zu schreiben, in der alle Daten in einer Abfrage abgerufen werden können.
Ich habe versucht, ein sehr einfaches Beispiel zusammenzustellen:
Schema-Setup :
CREATE TABLE MASTER
( ID INT NOT NULL
, NAME VARCHAR2(42 CHAR) NOT NULL
, CONSTRAINT PK_MASTER PRIMARY KEY (ID)
);
CREATE TABLE DATA
( ID INT NOT NULL
, MASTER_ID INT NOT NULL
, VALUE NUMBER
, CONSTRAINT PK_DATA PRIMARY KEY (ID)
, CONSTRAINT FK_DATA_MASTER FOREIGN KEY (MASTER_ID) REFERENCES MASTER (ID)
);
INSERT INTO MASTER values (1, 'One');
INSERT INTO MASTER values (2, 'Two');
INSERT INTO MASTER values (3, 'Three');
CREATE SEQUENCE SEQ_DATA_ID;
INSERT INTO DATA values (SEQ_DATA_ID.NEXTVAL, 1, 1.3);
INSERT INTO DATA values (SEQ_DATA_ID.NEXTVAL, 1, 1.5);
INSERT INTO DATA values (SEQ_DATA_ID.NEXTVAL, 1, 1.7);
INSERT INTO DATA values (SEQ_DATA_ID.NEXTVAL, 2, 2.3);
INSERT INTO DATA values (SEQ_DATA_ID.NEXTVAL, 3, 3.14);
INSERT INTO DATA values (SEQ_DATA_ID.NEXTVAL, 3, 3.7);
Abfrage A :
select NAME from MASTER
where ID = 1
| NAME |
--------
| One |
Abfrage B :
select ID, VALUE from DATA
where MASTER_ID = 1
| ID | VALUE |
--------------
| 1 | 1.3 |
| 2 | 1.5 |
| 3 | 1.7 |
Abfrage C :
select M.NAME, D.ID, D.VALUE
from MASTER M INNER JOIN DATA D ON M.ID=D.MASTER_ID
where M.ID = 1
| NAME | ID | VALUE |
---------------------
| One | 1 | 1.3 |
| One | 2 | 1.5 |
| One | 3 | 1.7 |
Natürlich habe ich keine Leistung mit diesen gemessen, aber man kann beobachten:
- Abfrage A + B gibt dieselbe Menge verwendbarer Informationen zurück wie Abfrage C.
- A + B muss 1 + 2x3 == 7 "Datenzellen" an den Client zurückgeben
- C muss 3x3 == 9 "Datenzellen" an den Client zurückgeben, da ich beim Join natürlich etwas Redundanz in die Ergebnismenge mit einbeziehe.
Verallgemeinern (so weit es geht):
Eine verknüpfte Abfrage muss immer mehr Daten zurückgeben als die einzelnen Abfragen, die dieselbe Informationsmenge erhalten. Da die Datenbank die Daten zusammenfügen muss, kann bei großen Datenmengen davon ausgegangen werden, dass die Datenbank mehr Arbeit an einer einzelnen verknüpften Abfrage als an den einzelnen Abfragen leisten muss, da (zumindest) mehr Daten an den Client zurückgegeben werden müssen.
Würde sich daraus ergeben, dass die Aufteilung einer clientseitigen Abfrage in mehrere Abfragen zu einer besseren Leistung führt, oder würde dies eher bedeuten, dass ich die verknüpfte Abfrage durcheinander gebracht habe?