2014-02-07 45 views
0

我有很大的DB。它大約有一百萬根琴絃。我需要這樣做:如何使SQL查詢更快?

select * from t1 WHERE id1 NOT IN (SELECT id2 FROM t2) 

但它的工作非常緩慢。我知道我可以使用「JOIN」語法來完成,但我無法理解。

+0

檢查parado的答案,而不是使用選擇*,只需選擇你需要的列。例如。從... –

回答

5

試試這個方法:

select * 
from t1 
left join t2 on t1.id1 = t2.id 
where t2.id is null 
+0

中選擇column1,column2#1317 - 查詢執行中斷 –

1

,首先你應該優化索引兩個表中,在那之後,你應該使用加入

0

有不同的方式DBMS可以處理這個任務:

它可以選擇從T2 ID2,然後選擇所有T1,其中ID1是不是在該組。你使用IN子句建議這個。

它可以記錄從t1選擇記錄,並尋找每一條記錄,如果它在T2找到一個匹配。你會使用EXISTS子句來建議這個。

可以外連接的表,然後扔掉所有比賽,並保持與非匹配的條目。這可能看起來像一個糟糕的方式,尤其是當有很多比賽,因爲你會得到很大的中間數據,然後扔大部分路程。但是,取決於dbms的工作方式,它可以相當快,例如,當它應用散列連接技術時。

這一切都取決於表的大小,比賽,索引等的數量和對DBMS讓你查詢一下。有dbms能夠完全重寫你的查詢來找到最佳的執行計劃。

說了這麼多,你可以嘗試不同的事情:

  • 的IN子句(SELECT DISTINCT ID2 FROM T2)。 DISTINCT可以顯着減少中間結果,真正加快查詢速度。 (但也許你的DBMS確實是無論如何得到良好的執行計劃。)
  • 使用EXISTS子句,看看是否有更快
  • 外參加由Parado建議