2015-09-15 45 views
0

我需要編寫一個儘可能高效的查詢,返回等於當天日期減去100天或200天的具有mycol時間戳值)的行。 (恰好是100或200天前 - 而不是一個區間)DB2 - 優化查詢 - 將函數應用於當前日期或db列?

注意mycol總是有00.00.000000時間。 (忽略這是爲什麼)

下面是如何可以寫一個例子:

select * from mytable mt where 
date(mycol) in (current date - 100 days, current date - 200 days) 

我想這可能是更有效的:

select * from mytable mt where 
mycol in (timestampadd(16,-100,timestamp(current date,'00:00:00')), 
      timestampadd(16,-200,timestamp(current date,'00:00:00'))) 

的原因,我相信它效率更高是因爲我沒有在mycol上調用函數(就像我在第一個示例中那樣),並且current date上的計算僅在每次執行此查詢時發生一次,而不是每行發生。

我的假設是否正確?

+0

您是否在尋找具有兩個值的比較或日期間的範圍? –

+0

只有兩個值 - 不是範圍 – NEW2WEB

回答

1

我會寫的第二個版本:

select * 
from mytable mt 
where mycol in (timestamp(current date - 100 days, '00:00:00'), 
       timestamp(current date - 200 days, '00:00:00') 
       ); 

如果您關心性能,那麼你應該在mytable(mycol)有一個指標,因爲這將加快查詢。如果沒有索引,額外的開銷是每行調用date()。您需要在您的環境中運行計時,以確定這是否是您環境中的問題。

0

我認爲第二個選擇更有效,但由於其他原因。

如果您在列mycol上聲明索引,則IN運算符將快得多。

但目前您執行date(mycol) db不能再使用該索引。

最好的方法是測試兩個查詢unsing analyze/explain

地址信息:

您應該考慮使用EXISTS代替IN作爲表演HERE

測試使用EXPLAIN de DB2或DB2 SQL性能分析器 然後你的兩個querys使用EXISTS嘗試同樣的版。

+0

如果mycol沒有索引會怎麼樣?有什麼區別嗎? – NEW2WEB

+0

不幸的是,我無法做解釋/分析,因爲我無法訪問此數據庫。只是將查詢提供給有但沒有應用知識的人。 – NEW2WEB

+0

對不起,在這種情況下我不知道,最好的方法是你嘗試使用'EXPLAIN',因爲我只是添加到我的答案。並比較刨牀正在做什麼。 –