非常に遅いSQLクエリがあります:
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'
目標は 1 つの値を返すことであり、postgresql は目的の値 (常に単一の値) を返すのに 1.7 秒かかります。1 つのタスクに対して何百ものクエリを実行する必要があるため、これは非常に遅くなります。同じクエリを実行しますが、interval と ::date, ::time を使用せずに時刻を直接指定すると、わずか 17 ミリ秒しかかかりません。
select number1 from mytable
where symbol = 25
and timeframe = 1
and date = '2008-02-05 11:10:00'
::date と ::time を使わない方が早いと思ったのですが、以下のようなクエリを実行すると
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 の日付/時刻関数は役に立ちませんでした。
テーブルは、シンボル、時間枠、日付で複数列のインデックスを取得しました。
時間を追加してクエリを実行する高速な方法、または ::date と ::time を使用する必要のない間隔で動作する構文はありますか? または、このようなクエリを使用する場合、特別なインデックスが必要ですか?
Postgresql のバージョンは 9.2 です。
編集: テーブルの形式は次のとおりです: 日付 = タイムゾーン付きタイムスタンプ、記号、時間枠 = 数値。
編集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
説明ショー:
「mytable で mcbidindex を使用したインデックス スキャン (コスト = 0.00..116.03 行 = 1 幅 = 7)」 " Index Cond: ((symbol = 25) AND (timeframe = 1) AND (date = '2008-02-05 11:10:00'::timestamp without time zone))"
時間が大幅に短縮されました: 最初の実行で 86 ミリ秒。