2012-07-27 109 views
4

下面的查詢可以優化嗎?SQL - 爲大表優化日期計算

select 
    max(date), sysdate - max(date) 
from 
    table; 

查詢執行時間〜5.7秒

我有另一種方法

select 
    date, sysdate - date 
from 
    (select * from table order by date desc) 
where 
    rownum = 1; 

查詢執行〜7.9秒

在這種特殊情況下,表中有大約1700萬項。

有沒有更好的方法來重寫呢?

更新:好吧,我嘗試了一些你在數據庫開發中建議的提示,儘管它的子集比原來的(約1,000,000條記錄)要小。沒有索引,查詢運行速度比索引慢。

第一個查詢,沒有索引:〜0.56秒,索引:〜0.2秒。第二個查詢,沒有索引:〜0.41秒,索引:〜0.005秒。 (這讓我感到吃驚,我認爲第一個查詢會比第二個查詢更快,也許它更適合更小的記錄集)。

我建議DBA這個解決方案,他會改變表結構以適應這種情況,然後我會用實際數據測試它。謝謝

+0

'date'是表中的一個字段嗎? – wallyk 2012-07-27 15:44:30

+0

這將始終需要全表掃描,我沒有看到任何方式來優化它。 – 2012-07-27 15:47:27

+0

@wallyk是的,它是! – joeygs 2012-07-27 15:57:12

回答

3

日期欄是否有索引?

+0

不,沒有 – joeygs 2012-07-27 16:04:55

+1

對列進行索引可以讓您更快地找到最大/最小值 – 2012-07-27 19:51:37

+0

@joeygs您是否可以添加索引,或者您是否處於非常有限的環境中?還有其他選項可以提高性能,但除非無法創建索引,否則不值得探索。 – 2012-07-28 03:44:50

1

該查詢非常簡單,除了在日期列上添加索引之外,可能無法對其進行優化。這是什麼數據庫? sysdate是表的另一列嗎?

+0

這是一個oracle數據庫,在PL/SQL中,SYSDATE是一個函數,它總是返回OS當前的日期時間值 – joeygs 2012-07-27 15:55:34

+0

@joeygs:嘗試添加一個索引'date'並檢查相同查詢的時間。 – wallyk 2012-07-27 17:20:35

+0

雖然我無法在生產數據庫中添加索引,但我會在開發數據庫中測試此解決方案,但僅使用一小部分數據來檢查性能 – joeygs 2012-07-30 13:47:28