2013-01-08 9 views
10

私は13 LEFT OUTER JOINSを使用しているクエリを持っています。左のテーブルは大きなデータを持っているため、クエリを実行して結果を返すのに非常に時間がかかります。 しかし、where句を使用して結果をフィルタリングすると、時間がかかりません。 私はまず最初に実行されることについて混乱します:結果を生成する結合とそれからwhere句のフィルタリング、または最初に結果をフィルタリングして結果の結合を取ります。これは最初に実行されます:joinまたはwhere句

+3

サーバがその仕事をより簡単に行うことができるように関係なく、SQL Serverのクエリオプティマイザは、周りのあなたの手順をシャッフルすることを選択したかの、あなたができる最善のことは、適切にあなたのデータを維持し、インデックスさを覚えておいてください。 –

+1

よく管理された 'STATISTICS'も役立ちます。 – MarkD

+0

あなたはあなたが情報を持っている場合、upvoteに忘れて、受け入れられたとマークしないでください –

答えて

10

一般的に、どのようなDBMS(SQLなど)も独自のクエリ最適化を行います。これは、最も高速だと思うアルゴリズムを使用します。だから、それはフィルタリングしてから参加します。

2

読む:which one runs first in query execution WHERE CLAUSE orJOIN CLAUSE ?

私はPinalデイブのポストをレディングしていると私はこれを見つけた、それはあなたが理解する助けをtalso migh

SQL SERVER – Interesting Observation of ON Clause on LEFT JOIN – How ON Clause affects Resultset in LEFT JOIN

enter image description here

enter image description here

ON句を理解するこれはJOINの前に適用されるため、Flag = 1のTable2のすべての結果を取得しますが、Table1のすべての行を取得するようにTable1に影響しません。 WHERE句が適用されると、結果は完全な結果に適用され、Flagが1に等しくないTable1とTable2からすべての行が削除され、基本的にTable1とTable2からフラグ= 1の行が保持されます。

2

Copied from my previous answer

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 

JOINが発生した後でフィルタリングします。

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

id   id 
----------- ----------- 
2   2 
関連する問題