Question conceptuelle: les requêtes individuelles sont-elles plus rapides que les jointures, ou: dois-je essayer de compresser toutes les informations souhaitées du côté client dans une seule instruction SELECT ou tout simplement d’en utiliser autant que cela semble utile?
TL; DR : Si ma requête jointe prend plus de temps que d'exécuter des requêtes individuelles, est-ce ma faute ou est-ce à prévoir?
Tout d’abord, je ne suis pas très familiarisé avec les bases de données, c’est donc peut-être juste moi, mais j’ai remarqué que lorsque je dois obtenir des informations à partir de plusieurs tables, il est "souvent" plus rapide d’obtenir ces informations via plusieurs requêtes sur des tables individuelles (peut-être contenant une simple jointure interne) et corrigez les données du côté client afin d’essayer d’écrire une requête jointe (complexe) dans laquelle je peux obtenir toutes les données d’une seule requête.
J'ai essayé de rassembler un exemple extrêmement simple:
Configuration du schéma :
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);
Requête A :
select NAME from MASTER
where ID = 1
| NAME |
--------
| One |
Requête B :
select ID, VALUE from DATA
where MASTER_ID = 1
| ID | VALUE |
--------------
| 1 | 1.3 |
| 2 | 1.5 |
| 3 | 1.7 |
Requête 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 |
Bien sûr, je n’ai mesuré aucune performance avec celles-ci, mais on peut observer:
- La requête A + B renvoie la même quantité d'informations utilisables que la requête C.
- A + B doit renvoyer 1 + 2x3 == 7 "cellules de données" au client.
- C doit renvoyer 3x3 == 9 "cellules de données" au client, car avec la jointure, j'inclus naturellement une certaine redondance dans le jeu de résultats.
Généraliser à partir de cela (aussi poussé qu'il soit):
Une requête jointe doit toujours renvoyer plus de données que les requêtes individuelles recevant la même quantité d'informations. Étant donné que la base de données doit regrouper les données, on peut supposer que pour les grands ensembles de données, elle doit travailler davantage sur une requête jointe que sur des requêtes individuelles, car (au moins) elle doit renvoyer plus de données au client.
Cela signifierait-il que, lorsque j'observe que le fractionnement d'une requête côté client en plusieurs requêtes génère de meilleures performances, c'est tout simplement la voie à suivre, ou est-ce que cela voudrait dire que j'ai foiré la requête jointe?