2010-07-29 33 views
0

林有點困惑是否應該使用nested Subquery或加入distinct! 哪一個表現更好更快?不同的幫助!

任何建議做這個查詢沒有distinct?!?

SELECT distinct TOP(20) e.*, u1.UserName As Sender, 
u2.UserName As Receiver, u1.Avatar AS SenderPic 
FROM Friends f INNER JOIN Users u 
ON(u.Id = f.SenderId OR u.Id = f.ReceiverId) AND State = 'ok' 
INNER JOIN Events e 
ON(f.SenderId = e.SenderId OR f.SenderId = e.ReceiverId 
OR f.ReceiverId = e.SenderId OR f.ReceiverId = e.ReceiverId) 
INNER JOIN Users u1 
ON (e.SenderId = u1.Id) 
INNER JOIN Users u2 
ON (e.ReceiverId = u2.Id) 
WHERE u.Id = @id; 
+0

SQL說明是你的朋友... – Nix 2010-07-29 17:15:58

回答

2

OR的在INNER JOIN條件將慢下來,但最終知道哪種方法將是最快的高度依賴於每個表中的行數。我建議嘗試兩種比較。

+0

可以說我們有一百萬條記錄作爲結果..是有效的使用我的方式!或者我應該用子查詢替換它! – Rawhi 2010-07-29 17:24:49

+0

加入非常大的表總是要求很高,所以一個或兩個子查詢可能會減少您正在使用的數據集。但我真的建議你花時間和測試。 – MPelletier 2010-07-29 17:45:53

0

這取決於DBMS。我在Oracle上的經驗是沒有太大的差別,但您可以使用SQL Explain語句來衡量成本。在您的SELECT中,重要的是您在所有ID上設置了索引。此外,我不太清楚爲什麼你需要獨特的,但要判斷這一點,我需要知道整個DB模型的基數。

+0

我如何找到'SQL Explain'!? – Rawhi 2010-07-29 17:30:59

+0

SQL執行計劃是他的意思 - 您可以在執行查詢時在SQL Server Management Studio中找到它。 – Sam 2010-07-29 17:34:58

+0

@Sam:感謝您澄清一開始並不清楚使用哪個DBMS。 – hol 2010-07-29 21:06:06