Kavramsal soru: Bireysel sorgular katılımdan daha hızlı mıdır, yoksa: Müşteri tarafında istediğim her bilgiyi bir SELECT ifadesine sıkıştırmaya mı çalışmalıyım yoksa uygun göründüğü kadarını kullanmalı mıyım?
TL; DR : Eğer benim katıldı sorgu bireysel sorgular çalışan daha uzun sürer, bu benim hatam ya bu beklenen nedir?
Birincisi, çok veritabanı bilgili değilim, bu yüzden sadece ben olabilirim, ancak birden fazla tablodan bilgi almak zorunda kaldığımda, bu bilgiyi ayrı ayrı masalarda birden fazla sorgu kullanarak elde etmenin "genellikle" daha hızlı olduğunu fark ettim (belki de basit bir iç birleşim içeren) ve tüm verileri tek bir sorguda elde edebileceğim (karmaşık) birleştirilmiş bir sorgu yazmayı denemek için verileri istemci tarafında birleştirin.
Birlikte son derece basit bir örnek vermeye çalıştım:
Şema Kurulumu :
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);
Sorgu A :
select NAME from MASTER
where ID = 1
Sonuçlar :
| NAME |
--------
| One |
Sorgu B :
select ID, VALUE from DATA
where MASTER_ID = 1
Sonuçlar :
| ID | VALUE |
--------------
| 1 | 1.3 |
| 2 | 1.5 |
| 3 | 1.7 |
Sorgu 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
Sonuçlar :
| NAME | ID | VALUE |
---------------------
| One | 1 | 1.3 |
| One | 2 | 1.5 |
| One | 3 | 1.7 |
Tabii ki, bunlarla hiçbir performansı ölçmedim, ancak biri gözlemleyebilir:
- A + B sorgusu, Query C ile aynı miktarda kullanılabilir bilgi verir.
- A + B müşteriye 1 + 2x3 == 7 "Veri Hücreleri" döndürmelidir
- C'nin müşteriye 3x3 == 9 "Veri Hücreleri" döndürmesi gerekiyor, çünkü birleştirme ile doğal olarak sonuç kümesine fazlalık eklerim.
Bundan genelleme (olduğu kadarıyla getirildi):
Birleştirilmiş bir sorgu her zaman aynı miktarda bilgi alan ayrı ayrı sorgulardan daha fazla veri döndürmelidir. Veritabanının verileri bir araya getirmesi gerektiğinden, büyük veri kümeleri için, tek bir birleştirilen sorguda veri tabanının bireysel olanlardan daha fazla çalışması gerektiği varsayılabilir, çünkü (en azından) müşteriye daha fazla veri döndürmesi gerekir.
Bundan bir müşteri tarafı sorgusunu çoklu sorgulara bölmenin daha iyi performans sağladığını gözlemlediğimde, bunun sadece gitmenin yolu olduğunu mu yoksa bunun yerine birleştirilmiş sorguyu batırdığım anlamına mı gelir?