12

13個のLEFTOUTERJOINSを使用しているクエリがあります。左端のテーブルには大きなデータがあるため、クエリを実行して結果を返すのに非常に時間がかかります。しかし、where句を使用して結果をフィルタリングしている場合は、非常に短い時間で済みます。今、私はどちらが最初に実行されるかについて混乱しています:結果を生成する結合、次にどこで句がそれからフィルタリングするか、または最初に結果をフィルタリングし、結果の結合を取ります。

4

3 に答える 3

11

一般に、DBMS(SQLなど)は独自のクエリ最適化を実行します。これは、最速と思われるアルゴリズムを使用します。つまり、フィルタリングしてから結合します。

于 2013-01-08T06:42:51.130 に答える
2

読み取り:クエリ実行で最初に実行されるのはどれですか?WHERECLAUSEまたはJOINCLAUSE?

私はピナルデイブのポストを赤くしています、そして私はこれを見つけました、それはあなたが理解するのを助けるかもしれません

SQL SERVER – LEFT JOINのON句の興味深い観察–ON句がLEFTJOINの結果セットにどのように影響するか

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ON句を理解すると、JOINの前に適用されます。そのため、Flag = 1であるTable2のすべての結果を取得しますが、Table1には影響しないため、table1のすべての行を取得します。WHERE句を適用すると、完全な結果に適用されるため、Flagが1に等しくないTable1およびTable2からすべての行が削除され、基本的にTable1およびTable2からflag=1行が保持されます。

于 2013-01-08T06:43:20.930 に答える
2

以前の回答からコピー

create table A(id int);
create table B(id int);

INSERT INTO A VALUES(1);
INSERT INTO A VALUES(2);
INSERT INTO A VALUES(3);

INSERT INTO B VALUES(1);
INSERT INTO B VALUES(2);
INSERT INTO B VALUES(3);

SELECT * FROM A;
SELECT * FROM B;

id
-----------
1
2
3

id
-----------
1
2
3

JOINでフィルタリングして、JOINプロセス中に行が追加されないようにします。

select a.*,b.*
from   A a left join B b 
on     a.id =b.id and a.id=2;

id          id
----------- -----------
1           NULL
2           2
3           NULL

WHEREは、JOINが発生した後にフィルタリングします。

select a.*,b.* 
from   A a left join B b 
on     a.id =b.id 
where  a.id=2;

id          id
----------- -----------
2           2
于 2013-01-08T06:46:08.463 に答える