Domanda concettuale: sono singole query più velocemente di quanto si unisce, o: Dovrei provare a spremere ogni informazioni che voglio sul lato client in una SELECT o semplicemente usare come molti come sembra conveniente?
TL; DR : se la mia query unita richiede più tempo dell'esecuzione di singole query, è colpa mia o è prevedibile?
Innanzitutto, non sono molto esperto di database, quindi posso essere solo io, ma ho notato che quando devo ottenere informazioni da più tabelle, è "spesso" più veloce ottenere queste informazioni tramite più query su singole tabelle (forse contenente un semplice join interno) e mettere insieme i dati sul lato client per provare a scrivere una query (complessa) unita in cui posso ottenere tutti i dati in una query.
Ho provato a mettere insieme un esempio estremamente semplice:
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);
Query A :
select NAME from MASTER
where ID = 1
| NAME |
--------
| One |
Quesito B :
select ID, VALUE from DATA
where MASTER_ID = 1
| ID | VALUE |
--------------
| 1 | 1.3 |
| 2 | 1.5 |
| 3 | 1.7 |
Query 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 |
Naturalmente, non ho misurato alcuna performance con questi, ma si può osservare:
- La query A + B restituisce la stessa quantità di informazioni utilizzabili della query C.
- A + B deve restituire 1 + 2x3 == 7 "Celle dati" al client
- C deve restituire 3x3 == 9 "Data Cells" al client, perché con il join includo naturalmente una ridondanza nel set di risultati.
Generalizzando da questo (per quanto recuperabile):
Una query unita deve sempre restituire più dati delle singole query che ricevono la stessa quantità di informazioni. Poiché il database deve mettere insieme i dati, per insiemi di dati di grandi dimensioni si può presumere che il database debba svolgere più lavoro su una singola query unita rispetto a quelle individuali, poiché (almeno) deve restituire più dati al client.
Ne conseguirebbe che, quando osservo che suddividere una query sul lato client in più query produce prestazioni migliori, questa è la strada da percorrere o significherebbe piuttosto che ho incasinato la query unita?