2013-01-03 382 views
1

我有一個SQL查詢,這是非常緩慢:PostgreSQL的查詢速度很慢與::日期,時間::和間隔

 select number1 from mytable 
     where symbol = 25 
     and timeframe = 1 
     and date::date = '2008-02-05' 
     and date::time='10:40:00' + INTERVAL '30 minutes' 

的目標是返回一個值,和PostgreSQL需要時1.7秒返回所需的值(總是一個值)。我需要爲一個任務執行數百個查詢,所以這變得非常緩慢。 執行相同的查詢,但不直接使用間隔和::日期指着時間,時間::只有17MS需要:

select number1 from mytable 
    where symbol = 25 
    and timeframe = 1 
    and date = '2008-02-05 11:10:00' 

我認爲這將是,如果我不會用::日期和更快: :時間,但是當我執行如下查詢時:

select number1 from mytable 
    where symbol = 25 
    and timeframe = 1 
    and date = '2008-02-05 10:40:00' + interval '30 minutes' 

我得到一個sql錯誤(22007)。我已經嘗試過不同的變化,但是如果不使用:: date和:: time,我就無法獲得間隔時間。日期/時間函數postgresql.org沒有幫助我。

表中的符號,時間範圍,日期有多列索引。

有沒有執行與增加時間,或間隔工作語法,我沒有使用::日期和時間::查詢的快捷方式?或者當我使用像這樣的查詢時需要有一個特殊的索引?

Postgresql版本是9.2。

編輯: 表格的格式是: date =帶時區的時間戳, symbol,timeframe = numeric。

編輯2: 使用

select open from ohlc_dukascopy_bid 
where symbol = 25 
and timeframe = 1 
and date = timestamp '2008-02-05 10:40:00' + interval '30' minute 

說明顯示:

 
"Index Scan using mcbidindex on mytable (cost=0.00..116.03 rows=1 width=7)" 
" Index Cond: ((symbol = 25) AND (timeframe = 1) AND (date = '2008-02-05 11:10:00'::timestamp without time zone))" 

現在時間相當快:第一次運行86ms。

+0

並請發佈完整的錯誤消息,不僅錯誤號。 –

+0

我只在符號,時間範圍,日期上有多列索引。會爲日期專門設置一個額外的索引嗎?我認爲多列索引就足夠了。編輯:我看到我應該運行一個解釋,看看我的索引是否正在使用。 – harbun

+0

取決於如何定義索引。索引中的第一列是哪一列?請張貼全表定義,包括索引和執行計劃 –

回答

4

第一個版本將不會在名爲date列使用(普通)指數。

您沒有提供太多的信息,但假設名爲date列具有數據類型timestamp(而不是date),那麼下面應該工作:

and date = timestamp '2008-02-05 10:40:00' + interval '30 minutes' 

這應該使用在指定的列的索引date(但僅當它實際上是timestamp而不是date時)。它本質上是一樣的你,唯一的區別是明確的時間戳文字(儘管Postgres的應該瞭解'2008-02-05 10:40:00'作爲時間戳文字爲好)。

您將需要如果它使用一個索引來運行explain找出來。

並請:更改該列的名稱。使用保留字作爲標識符是個不好的做法,它是一個非常可怕的名字,它沒有說明列中存儲了什麼類型的信息。它是「開始日期」,「結束日期」,「到期日期」,...?

+0

工程就像一個魅力。如果可以的話,會給答案速度+1。你介意看看解釋並告訴我它是否按需要使用索引?我認爲它確實,但我不確定我是否正確閱讀。 – harbun

+0

@harbun:是的,它確實使用索引:*索引使用mytable上的mcbidindex掃描* –