2011-10-03 28 views
0

所以,我有這兩個表。一個包含,讓我們打電話給他們,錯誤,另一個包含解決方案。一個錯誤可能有多個解決方案(或者狀態,如果可能的話),我想得到最後一個。獲取加入的最後一個條目

現在,我在做這樣的:

Select b.*, ap.approveMistakeId 
from bugs_table as b 
LEFT JOIN (select approveId, approveCause, approveDate, approveInfo, 
        approveUsername, mistakeId as approveMistakeId 
      from approve_table 
      order by approveDate desc) AS ap 
ON m.mistakeId = ap.approveMistakeId 
GROUP BY b.bugId 

這不是一個完整的查詢,它只是展示如何我接近它。真正的查詢加入了10個以上的表格。

問題在於,使用此子查詢時,查詢運行約3.3秒並返回~2.4K記錄。沒有這個查詢,它運行0.4s,這是更可接受的。我已在approveDate上創建並編制索引,但似乎沒有解決問題。

解決方案是否可以是一個視圖,該視圖是從此查詢創建的,然後加入到此查詢中?或者有沒有辦法以其他方式做到這一點?

謝謝!

+0

你應該對子選擇的性能進行基準測試。而順序是沒有必要的。 – ajreal

+0

是的,子選擇是邪惡的一部分。 –

回答

0

問題是子選擇。解決方案 - 解除歸一化。是的,我知道,這不是最好的解決方案,但絕對是最快的。

嘗試聚合自我排序,但只增加了時間。與加入觀點相同。

0

對於連接兩個表,基本上應該有一些連接條件。如果我把m.mistakeId = ap.approveMistakeIdb.mistakeId = ap.approveMistakeId,那麼你也可以去一個更簡單的連接,如:

Select b.*, ap.approveMistakeId, ap.approveDate 
from bugs_table as b 
    INNER JOIN approve_table as ap ON b.mistakeId = ap.approveMistakeId 
order by ap.approveDate desc 
相關問題