개념적 질문 : 개별 쿼리가 조인보다 빠르 거나 클라이언트 측에서 원하는 모든 정보를 하나의 SELECT 문 으로 압축 하거나 편리한 것처럼 많이 사용해야합니까?
TL; DR : 경우 제 에 가입 쿼리가 개별 쿼리를 실행하는 것보다 더 오래 걸립니다,이 내 잘못, 또는이 기대할 수 있나요?
첫째, 나는 데이터베이스에 정통하지 않기 때문에 나일 수도 있지만 여러 테이블에서 정보를 가져와야 할 때 개별 테이블에 대한 여러 쿼리를 통해이 정보를 얻는 것이 "종종"더 빠르다는 것을 알았습니다. 하나의 쿼리로 모든 데이터를 얻을 수있는 (복잡한) 조인 된 쿼리를 작성하려고 클라이언트 측에서 데이터를 함께 패치합니다.
나는 매우 간단한 예를 하나 모아 보았습니다.
스키마 설정 :
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);
쿼리 A :
select NAME from MASTER
where ID = 1
결과 :
| NAME |
--------
| One |
쿼리 B :
select ID, VALUE from DATA
where MASTER_ID = 1
결과 :
| ID | VALUE |
--------------
| 1 | 1.3 |
| 2 | 1.5 |
| 3 | 1.7 |
쿼리 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 |
물론, 나는 이것으로 성능을 측정하지는 않았지만 관찰 할 수 있습니다.
- 쿼리 A + B는 쿼리 C와 동일한 양의 사용 가능한 정보를 반환합니다.
- A + B는 1 + 2x3 == 7 "데이터 셀"을 클라이언트에 반환해야합니다.
- C는 클라이언트에게 3x3 == 9 "Data Cells"를 반환해야합니다.
이것으로부터 일반화 (있는 그대로 가져옵니다) :
조인 된 쿼리는 항상 같은 양의 정보를받는 개별 쿼리보다 더 많은 데이터를 반환해야합니다. 데이터베이스가 데이터를 함께 모아야하기 때문에 큰 데이터 세트의 경우 데이터베이스는 개별 쿼리보다 단일 결합 된 쿼리에 대해 더 많은 작업을 수행해야한다고 가정 할 수 있습니다.
클라이언트 측 쿼리를 여러 쿼리로 나누면 더 나은 성능을 얻는다는 것을 알았을 때, 이것은 갈 길이거나 오히려 결합 된 쿼리를 엉망으로 만들었다는 것을 의미합니까?