2013-01-08 20 views
10

我有一個查詢,其中我使用13左外部連接。左表有一個大數據,所以它需要非常多的時間來執行查詢並返回結果。 但是,當我使用where子句過濾結果時,它花費的時間非常少。 現在我很疑惑哪一個首先執行:產生結果的連接,然後是where子句從它過濾或首先它過濾結果的連接結果。其中運行第一:聯接或where子句

+3

請記住,無論SQL Server的查詢優化程序如何選擇隨機播放,最好的方法是正確維護和索引數據,以便服務器更輕鬆地完成工作。 –

+1

維護得好'STATISTICS'也有幫助。 – MarkD

+0

不要忘記upvote並將其標記爲已接受,如果您獲得的信息是wnat –

回答

10

一般來說,任何DBMS(如SQL)都會執行自己的查詢優化,它使用它認爲最快的算法。所以它是過濾,然後加入。

2

閱讀:which one runs first in query execution WHERE CLAUSE orJOIN CLAUSE ?

我雷丁皮納爾戴夫後,我發現這一點,migh talso幫助你瞭解

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之前應用,這就是爲什麼它檢索Table2的所有結果,其中Flag = 1但它不影響Table1,因此它檢索table1的所有行。當應用WHERE子句時,它適用於完整結果,因此它將從Table1和Table2中刪除Flag不等於1的所有行,從而使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,以防止在連接過程被添加行。

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發生後將會過濾WHERE。

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

id   id 
----------- ----------- 
2   2