2013-10-28 66 views
0

我有這個精心緩慢的查詢,並且不知道問題是什麼。我曾嘗試添加多個where子句,但沒有任何效果。執行時間超過5分鐘。SQL內部連接,執行時間

目標是選擇上次使用LM_MAT中的產品的時間。這是從股票突變確定的; LMH_MAT。 LMH_MAT確實有160K記錄,但是從lmh_mat執行Select *只需要16 ms。

我已經確定從this site這樣做的解決方案。

刪除第二個子查詢(select top 1 ...)確實會將執行時間降低到6秒以下,這意味着刪除整個目的:選擇上一次使用產品的時間。

平臺:Sybase Advantage數據架構師。

我希望有人能幫助我!

親切的問候, 盧卡斯

查詢:

select 
lm_matn, 
LM_OMSCH, 
lm_hoev, 
lm_minh, 
lm_preh, 
lm_datin, 
XDate 
from lm_mat A 
left join (select lmh_matn, lmh_id, cast(lmh_date as sql_date) as XDate 
      from lmh_mat) F 
      on A.lm_matn = F.lmh_matn 
      AND F.lmh_id in 
      (select top 1 FF.lmh_id 
       from lmh_mat FF 
       where FF.lmh_matn=A.lm_matn 
       order by FF.lmh_date desc) 
group by 
    lm_matn, 
    LM_OMSCH, 
    lm_hoev, 
    lm_minh, 
    lm_preh, 
    lm_datin, 
    XDate 
+0

您可以發佈一個執行計劃? –

+0

爲了清楚你想從'lmh_mat'表中選擇'lmh_date'和'lmh_matn',把它放入一個帶有'lm_mat'的左連接中?如果你從行中選擇隨機值,這是非常棘手的,但是你想要的兩個值都與子查詢有關,所以這裏應該有一個簡化。 – 2013-10-28 15:02:09

回答

0

看看這樣的事情讓任何接近你想要的結果:

SELECT 
    lm_matn, LM_OMSCH, lm_hoev, lm_minh, lm_preh, lm_datin, XDate 
FROM lm_mat 
LEFT JOIN (SELECT 
    lmh_matn, 
    MAX(lmh_date) AS XDate 
    FROM lmh_mat 
    GROUP BY lmh_matn 
) AS a ON lmh_matn = lm_matn 
GROUP BY 
    lm_matn, LM_OMSCH, lm_hoev, lm_minh, lm_preh, lm_datin, XDate 
+0

是的,這確實有幫助!非常感謝! 如果不是簡單的max(lmh_date),那麼優化此查詢的解決方案是什麼? – user2928360

+0

@ user2928360在這種情況下,MAX(lmh_date)是您用來查找所需記錄的標準,因此您只需更改該標準即可。如果你想從lmh_mat(比如lmh_id)取代其他東西,而不是SELECT的頂部的XDate,那麼它會變得更有趣。 (我之前做過這樣的查詢,但沒有任何方便看) – 2013-10-29 16:20:42