Pytanie koncepcyjne: Czy poszczególne zapytania są szybsze niż złączenia, czy: Czy powinienem próbować wycisnąć wszystkie informacje, które chcę po stronie klienta, w jedną instrukcję SELECT, czy po prostu użyć tyle, ile wydaje się wygodne?
TL; DR : Jeśli moje połączone zapytanie trwa dłużej niż uruchamianie pojedynczych zapytań, czy to moja wina, czy należy się tego spodziewać?
Po pierwsze, nie jestem zbyt obeznany z bazami danych, więc to może być tylko ja, ale zauważyłem, że kiedy muszę uzyskać informacje z wielu tabel, „często” szybciej jest uzyskać te informacje poprzez wiele zapytań w poszczególnych tabelach (może zawierające proste sprzężenie wewnętrzne) i załataj dane po stronie klienta, aby spróbować napisać (złożone) połączone zapytanie, w którym mogę uzyskać wszystkie dane w jednym zapytaniu.
Próbowałem połączyć jeden niezwykle prosty przykład:
Konfiguracja schematu :
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);
Zapytanie A :
select NAME from MASTER
where ID = 1
Wyniki :
| NAME |
--------
| One |
Zapytanie B :
select ID, VALUE from DATA
where MASTER_ID = 1
Wyniki :
| ID | VALUE |
--------------
| 1 | 1.3 |
| 2 | 1.5 |
| 3 | 1.7 |
Zapytanie 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
Wyniki :
| NAME | ID | VALUE |
---------------------
| One | 1 | 1.3 |
| One | 2 | 1.5 |
| One | 3 | 1.7 |
Oczywiście nie mierzyłem z nimi żadnych wyników, ale można zauważyć:
- Zapytanie A + B zwraca tę samą ilość użytecznych informacji, co zapytanie C.
- A + B musi zwrócić klientowi 1 + 2x3 == 7 „komórek danych”
- C musi zwrócić klientowi 3x3 == 9 „komórek danych”, ponieważ w przypadku łączenia dołączam oczywiście pewną nadmiarowość w zestawie wyników.
Uogólniając na podstawie tego (tak dalece jak to jest pobierane):
Połączone zapytanie zawsze musi zwracać więcej danych niż pojedyncze zapytania, które otrzymują tę samą ilość informacji. Ponieważ baza danych musi łączyć dane, w przypadku dużych zestawów danych można założyć, że baza danych musi wykonać więcej pracy na jednym połączonym zapytaniu niż na pojedynczych połączonych zapytaniach, ponieważ (przynajmniej) musi zwrócić więcej danych do klienta.
Czy wynikałoby to z tego, że kiedy zauważę, że podział zapytania po stronie klienta na wiele zapytań daje lepszą wydajność, jest to po prostu droga, czy raczej oznacza to, że pomieszałem połączone zapytanie?