Pergunta conceitual: as consultas individuais são mais rápidas que as associações, ou: Devo tentar espremer todas as informações que desejo do lado do cliente em uma instrução SELECT ou apenas usar quantas parecer conveniente?
TL; DR : Se minha consulta ingressada demorar mais do que a execução de consultas individuais, isso é culpa minha ou isso é esperado?
Primeiro, não sou muito conhecedor de bancos de dados, portanto, sou eu, mas notei que, quando preciso obter informações de várias tabelas, é "frequentemente" mais rápido obter essas informações por meio de várias consultas em tabelas individuais (talvez contendo uma junção interna simples) e remende os dados juntos no lado do cliente para tentar escrever uma consulta ingressada (complexa) onde eu possa obter todos os dados em uma consulta.
Eu tentei colocar um exemplo extremamente simples:
Configuração do 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 |
Obviamente, não medi nenhum desempenho com isso, mas podemos observar:
- A consulta A + B retorna a mesma quantidade de informações utilizáveis que a consulta C.
- A + B deve retornar 1 + 2x3 == 7 "Células de Dados" para o cliente
- C precisa retornar 3x3 == 9 "Células de Dados" ao cliente, porque com a junção naturalmente incluo alguma redundância no conjunto de resultados.
Generalizando a partir disso (por mais buscado que seja):
Uma consulta ingressada sempre deve retornar mais dados do que as consultas individuais que recebem a mesma quantidade de informações. Como o banco de dados precisa reunir os dados, para conjuntos de dados grandes, pode-se supor que o banco de dados tenha que trabalhar mais em uma única consulta unida do que nas individuais, pois (pelo menos) ele deve retornar mais dados ao cliente.
Daqui resulta que, quando observo que a divisão de uma consulta do lado do cliente em várias consultas produz um melhor desempenho, esse é apenas o caminho a seguir ou seria melhor dizer que eu estraguei a consulta unida?