概念的な質問:個々のクエリは結合よりも高速ですか、またはクライアント側で必要なすべての情報を1つの SELECTステートメントに絞り込もうとするか、便利だと思われるだけ使用する必要がありますか?
TL; DR:結合されたクエリに個々のクエリを実行するよりも時間がかかる場合、これは私のせいですか、これは予想されることですか?
まず、データベースに精通していないので、私だけかもしれませんが、複数のテーブルから情報を取得する必要がある場合、個々のテーブルで複数のクエリを使用してこの情報を取得する方が「多くの場合」高速であることに気付きました単純な内部結合を含む)、1つのクエリですべてのデータを取得できる(複雑な)結合クエリを作成しようとするクライアント側でデータをパッチします。
私は非常に単純な例を1つまとめようとしました。
スキーマのセットアップ:
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は、クエリCと同じ量の使用可能な情報を返します。
- A + Bは1 + 2x3 == 7「データセル」をクライアントに返す必要があります
- Cは、3x3 == 9「データセル」をクライアントに返す必要があります。これは、結合により、結果セットに冗長性が自然に含まれるためです。
これから一般化する(これまでの限り取得):
結合されたクエリは、常に同じ量の情報を受け取る個々のクエリよりも多くのデータを返す必要があります。データベースはデータをまとめる必要があるため、大規模なデータセットの場合、(少なくとも)より多くのデータをクライアントに返す必要があるため、データベースは個々のクエリよりも単一の結合クエリでより多くの作業を行う必要があると想定できます。
これから、クライアント側のクエリを複数のクエリに分割するとパフォーマンスが向上することがわかった場合、これは単なる方法であり、結合されたクエリを台無しにすることを意味しますか?