Концептуальне запитання: чи індивідуальні запити швидше, ніж приєднуються, або: Чи слід намагатися видавити кожну інформацію, яку я хочу на стороні клієнта, в один оператор 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 повертає таку ж кількість корисної інформації, що і Query C.
- A + B має повернути клієнтові 1 + 2x3 == 7 "Осередки даних"
- C повинен повернути клієнтові 3x3 == 9 "Осередки даних", тому що при об'єднанні я, природно, включаю деяку надмірність у набір результатів.
Узагальнення з цього (наскільки це можливо):
Об'єднаний запит завжди повинен повертати більше даних, ніж окремі запити, які отримують однаковий обсяг інформації. Оскільки база даних повинна зв'язати дані, для великих наборів даних можна припустити, що база даних повинна більше працювати над одним об'єднаним запитом, ніж над окремими, оскільки (принаймні) вона повинна повертати більше даних клієнту.
З цього випливає, що коли я зауважую, що розбиття запиту на стороні клієнта на кілька запитів дає кращу ефективність, це просто шлях, або це швидше означатиме, що я переплутав об'єднаний запит?