2010-08-10 58 views
3

我有以下的sql語句,我需要更快。 有500k行,我是'HARDWARE_ID'的索引,但這仍需要一秒鐘才能完成。sql:如何改進這個陳述

有沒有人有任何想法?

select 
     * 
    from 
     DEVICE_MONITOR DM 
    where 
      DM.DM_ID = (
     select 
      max(DM_ID) 
     from 
      DEVICE_MONITOR 
     where 
      HARDWARE_ID=#value# 
    ) 

我發現下面的指數也有很大的幫助......

CREATE INDEX ON DM_IX4 DEVICE_MONITOR(DM_ID,HARDWARE_ID);

在我的測試中,它將運行時間從26秒減少到20秒。

感謝您的幫助。

+0

您是否也有DM_ID的索引? – 2010-08-10 12:36:20

回答

2

爲DM_ID的指數應爲ASC創建

的問題可能是這個,你發現非常快的比賽形式HARDWARE_ID,但隨後這些記錄必須排序來從他們max和這個操作時間耗時。

嘗試比較這聲明:

1 #result = select max(DM_ID) from DEVICE_MONITOR where HARDWARE_ID=#value# 

2 select * from DEVICE_MONITOR DM where DM.DM_ID = #result 

查詢1是問題,因爲你將要看到的是,2工作更快

如果創建了索引和查詢還是慢騰騰比,你可以更新統計數據。但其他查詢可能只會工作得更慢。

如果可以代替*僅使用您真正需要的列

0

如果您在DM_ID上有聚簇索引,那麼看起來就像是最快的查詢。

編輯:Ack。丹尼爾有正確的答案。錯過了。

1

考慮將'*'更改爲您需要的屬性列表。很多時候,這可以讓你大幅提高速度。

+0

完全同意你的看法。這可能會爲您提供最大的性能提升。 – 2010-08-10 12:56:37