時系列の値 (株式市場価格のランダム ウォークなど) を 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)
または類似のものです (しかし、これだけでより高速になるでしょうか? おそらく、事前に集計された値を保持する別のテーブルを作成しますか?)
これを達成する方法はありますか?