Pregunta conceptual: ¿Las consultas individuales son más rápidas que las unidas, o: ¿Debería tratar de exprimir cada información que quiero en el lado del cliente en una declaración SELECT o simplemente usar tantas como me parezca conveniente?
TL; DR : Si mi consulta unida lleva más tiempo que la ejecución de consultas individuales, ¿es mi culpa o es de esperar?
En primer lugar, no soy muy conocedor de la base de datos, por lo que puede ser solo yo, pero he notado que cuando tengo que obtener información de varias tablas, es "a menudo" más rápido obtener esta información a través de múltiples consultas en tablas individuales (tal vez que contiene una combinación interna simple) y unir los datos en el lado del cliente para intentar escribir una consulta unida (compleja) donde pueda obtener todos los datos en una consulta.
He tratado de poner un ejemplo extremadamente simple:
Configuración del esquema :
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);
Consulta A :
select NAME from MASTER
where ID = 1
| NAME |
--------
| One |
Consulta B :
select ID, VALUE from DATA
where MASTER_ID = 1
| ID | VALUE |
--------------
| 1 | 1.3 |
| 2 | 1.5 |
| 3 | 1.7 |
Consulta 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 |
Por supuesto, no medí ningún rendimiento con estos, pero uno puede observar:
- La consulta A + B devuelve la misma cantidad de información utilizable que la consulta C.
- A + B tiene que devolver 1 + 2x3 == 7 "Celdas de datos" al cliente
- C tiene que devolver 3x3 == 9 "Celdas de datos" al cliente, porque con la unión, naturalmente, incluyo algo de redundancia en el conjunto de resultados.
Generalizando a partir de esto (tan descabellado como sea):
Una consulta unida siempre debe devolver más datos que las consultas individuales que reciben la misma cantidad de información. Dado que la base de datos tiene que improvisar los datos, para grandes conjuntos de datos se puede suponer que la base de datos tiene que hacer más trabajo en una sola consulta unida que en las consultas individuales, ya que (al menos) tiene que devolver más datos al cliente.
¿De esto se deduce que cuando observo que dividir una consulta del lado del cliente en múltiples consultas produce un mejor rendimiento, este es el camino a seguir, o más bien significa que arruiné la consulta unida?