คำถามแนวคิด: แบบสอบถามแต่ละรายการเร็วกว่าการเข้าร่วมหรือ: ฉันควรพยายามบีบข้อมูลทุกครั้งที่ฉันต้องการในฝั่งไคลเอ็นต์ให้เป็นคำสั่ง SELECT หนึ่งคำหรือใช้ให้มากที่สุดเท่าที่จะสะดวก?
TL : DR : หากคิวรีที่เข้าร่วมของฉันใช้เวลานานกว่ารันคิวรีแต่ละรายการนี่เป็นความผิดของฉันหรือเป็นสิ่งที่คาดหวัง
ก่อนอื่นฉันไม่ค่อยเข้าใจฐานข้อมูลมากนักดังนั้นอาจเป็นเพียงฉัน แต่ฉันสังเกตว่าเมื่อฉันต้องรับข้อมูลจากหลาย ๆ ตารางมันเร็วกว่าที่จะได้รับข้อมูลนี้จากการสืบค้นหลายรายการในตารางแต่ละรายการ มีการรวม Inner ง่ายๆ) และแก้ไขข้อมูลร่วมกันบนฝั่งไคลเอ็นต์ที่พยายามเขียนแบบสอบถามแบบซับซ้อน (ซับซ้อน) ที่ฉันสามารถรับข้อมูลทั้งหมดในแบบสอบถามเดียว
ฉันพยายามใส่ตัวอย่างง่ายๆอย่างหนึ่งไว้ด้วยกัน:
การตั้งค่าสคีมา :
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 |
แน่นอนฉันไม่ได้วัดประสิทธิภาพใด ๆ กับสิ่งเหล่านี้ แต่อย่างใดอย่างหนึ่งอาจสังเกต:
- Query A + B ส่งคืนข้อมูลที่สามารถใช้งานได้เท่ากับ Query C
- A + B ต้องส่งคืน 1 + 2x3 == 7 "Data Cells" ให้กับลูกค้า
- C ต้องส่งคืน 3x3 == 9 "Data Cells" ให้กับลูกค้าเนื่องจากการเข้าร่วม I โดยธรรมชาติแล้วจะรวมความซ้ำซ้อนบางอย่างในชุดผลลัพธ์
การสรุปจากสิ่งนี้ (เท่าที่ทำได้):
แบบสอบถามที่เข้าร่วมจะต้องส่งคืนข้อมูลมากกว่าแบบสอบถามแต่ละรายการที่ได้รับข้อมูลจำนวนเท่ากันเสมอ เนื่องจากฐานข้อมูลจะต้องมีการรวมข้อมูลเป็นก้อนสำหรับชุดข้อมูลขนาดใหญ่สามารถสันนิษฐานได้ว่าฐานข้อมูลจะต้องทำงานกับคิวรีแบบร่วมเดียวมากกว่าในแต่ละรายการเนื่องจาก (อย่างน้อย) จึงต้องส่งคืนข้อมูลเพิ่มเติมไปยังไคลเอนต์
มันจะติดตามจากนี้ไหมเมื่อฉันสังเกตว่าการแยกคิวรีฝั่งไคลเอ็นต์ออกเป็นหลายคิวรีให้ประสิทธิภาพที่ดีกว่านี่เป็นเพียงวิธีที่จะไปหรือค่อนข้างจะหมายความว่าฉันทำแบบสอบถามคิวรีเข้าร่วม