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