3

時系列の値 (株式市場価格のランダム ウォークなど) を PostgreSQL データベースに格納しています。これは非常に大きなテーブルであり、任意の期間のクエリを同様に高速に処理できるようにしたいと考えています。私はこのチャートを頭の片隅に持っています。

簡単な例:

WITH t(ts, val) AS ( VALUES
    ('2012-10-04 00:00:00'::timestamp, 1.11::numeric),
    ('2012-10-04 00:00:01', 1.21),
    ('2012-10-04 00:00:02', 1.25),
    ('2012-10-04 00:00:03', 1.41),
    ('2012-10-04 00:00:04', 1.31),
    ('2012-10-04 00:00:05', 1.25),
    ('2012-10-04 00:00:06', 1.33))

(timestamp 列にインデックスがあると仮定します。) テーブルが大きく、たとえば 1 年の四半期などの期間のすべての値を取得するには長い時間がかかります。ただし、そのデータでやりたいことは、世界的な傾向を視覚化するためのプロットを作成することだけなので、その期間からデータ セット全体を取得する必要は実際にはありませんが、代表的なサブセットは問題ありません。

私の頭に浮かんだこと:

  • サブステートメントのリストを生成します。各サブステートメントは、短いサブ時間間隔 (たとえば、1 時間間隔ごとに 1 つの値) に対して 1 つの任意の値を取得します。
  • 値を集計します。たとえばAVG()、group bydate_trunc('hour', ts)または類似のものです (しかし、これだけでより高速になるでしょうか? おそらく、事前に集計された値を保持する別のテーブルを作成しますか?)

これを達成する方法はありますか?

4

1 に答える 1

1

私の最初の衝動は、集約されたデータを使用してマテリアライズドビューを作成することです。これは非常に高速である必要があります(作成するための1回限りの操作はカウントされません)。

それを除けば、データベースにこれ以上オブジェクトを作成したくない場合は、(本当に)ランダムな選択とインデックスの組み合わせが高速で十分に有効である可能性があります。

テーブルの詳細と実際のサイズ、および結果がどれだけ正確でなければならないかに関する要件によっては、これらの線に沿って何かを引き出すことができる場合があります。これは比較的高速です。

于 2012-10-15T17:12:42.260 に答える