Pertanyaan konseptual: Apakah pertanyaan individu lebih cepat daripada bergabung, atau: Haruskah saya mencoba memeras setiap info yang saya inginkan di sisi klien menjadi satu pernyataan SELECT atau hanya menggunakan sebanyak mungkin yang dianggap nyaman?
TL; DR : Jika kueri gabungan saya membutuhkan waktu lebih lama daripada menjalankan kueri individual, apakah ini salah saya atau apakah ini yang diharapkan?
Pertama, saya tidak terlalu paham basis data, jadi mungkin hanya saya, tetapi saya perhatikan bahwa ketika saya harus mendapatkan informasi dari beberapa tabel, "seringkali" lebih cepat untuk mendapatkan informasi ini melalui beberapa kueri di setiap tabel (mungkin berisi gabungan bagian dalam yang sederhana) dan menambal data bersama di sisi klien yang mencoba menulis kueri gabungan (kompleks) di mana saya bisa mendapatkan semua data dalam satu kueri.
Saya telah mencoba menyatukan satu contoh sederhana:
Pengaturan Skema :
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);
Kueri A :
select NAME from MASTER
where ID = 1
Hasil :
| NAME |
--------
| One |
Kueri B :
select ID, VALUE from DATA
where MASTER_ID = 1
Hasil :
| ID | VALUE |
--------------
| 1 | 1.3 |
| 2 | 1.5 |
| 3 | 1.7 |
Kueri 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
Hasil :
| NAME | ID | VALUE |
---------------------
| One | 1 | 1.3 |
| One | 2 | 1.5 |
| One | 3 | 1.7 |
Tentu saja, saya tidak mengukur kinerja apa pun dengan ini, tetapi orang dapat mengamati:
- Kueri A + B mengembalikan informasi yang dapat digunakan dengan jumlah yang sama dengan Kueri C.
- A + B harus mengembalikan 1 + 2x3 == 7 "Sel Data" ke klien
- C harus mengembalikan 3x3 == 9 "Sel Data" ke klien, karena dengan bergabung saya secara alami menyertakan beberapa redundansi dalam set hasil.
Generalisasi dari ini (sejauh apa adanya):
Permintaan gabungan selalu harus mengembalikan lebih banyak data daripada kueri individual yang menerima jumlah informasi yang sama. Karena basis data harus menggabungkan data, untuk kumpulan data yang besar seseorang dapat mengasumsikan bahwa basis data harus melakukan lebih banyak pekerjaan pada satu permintaan gabungan daripada pada permintaan individu, karena (setidaknya) ia harus mengembalikan lebih banyak data ke klien.
Apakah ini akan mengikuti dari ini, bahwa ketika saya amati bahwa memecah permintaan sisi klien menjadi beberapa kueri menghasilkan kinerja yang lebih baik, ini adalah cara yang tepat, atau apakah itu lebih berarti bahwa saya mengacaukan kueri yang tergabung?