3

非常に遅い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 ミリ秒。

4

1 に答える 1

6

最初のバージョンは、という名前の列で (通常の) インデックスを使用しません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インデックスを使用しているかどうかを確認するには、を実行する必要があります。

そしてお願いします:その列の名前を変更してください。予約語を識別子として使用するのは悪い習慣であり、列に格納されている情報の種類について何も述べていない、本当に恐ろしい名前です。それは「開始日」、「終了日」、「期日」、……ですか?

于 2013-01-03T09:41:43.827 に答える