web-dev-qa-db-ja.com

PostgreSQLでのローリングデータの保存とクエリ

大量の気象モデルデータをPostgreSQLデータベースに入れています。マシンには8つのコアと16 GBのRAMがあります。 PostGIS 2.1でPostgreSQL 9.3を実行しています。各テーブルには、さまざまな気象データ(気温、露点、風など)があります。各テーブルには6〜7列があります。緯度、経度、ポイントジオメトリ、標高、モデルが関連する日時、および対象となる1〜2のデータ値です。データは主に、時間と高度によって境界ボックスを照会されます。テーブルごとに約145,757,360行になります(現在より古いデータは関係がなくなったため、削除されます)。テーブルのサイズは、おおよそ、インデックスなしで約10 GBと推定されます。 (これは、52バイトのデータと1行あたり23バイトのオーバーヘッドです)。新しいモデルデータが利用可能になると、データは定期的に更新/挿入されます。注:新しいデータには、テーブルの既存の値の上書きが含まれます。

だから私はこれらの2つの計画を見ています:

  1. ポイントジオメトリの追加のインデックスを使用して、(日時、標高)でインデックスを付けてクラスタ化するだけです。古い行を削除し、vacuum/analyzeを実行し、再クラスター化する通常のcronジョブを実行します。
  2. 日時でパーティションを作成し、ジオメトリのインデックスを持つテーブルごとに標高でクラスタ化してインデックスを作成します。通常のcronジョブを実行して、新しいテーブルを追加し、古いテーブルを削除します。

さらに、

  • したがって、テーブルを削除する方がはるかに効率的で、削除してバキューム処理を行うことを知っています。しかし、それ以外の場合はパフォーマンスが向上しますか?
  • パーティションは、すべてのテーブルが均等に更新されて削除されるまで適切ではない場合に適切ですか(ドキュメントでは、一部のテーブルのみを選択した場合にパーティションが最適に機能することが示されています)。

データを配信する場合、選択はクラスター化インデックスよりも高速になりますか?複数のリクエストが一度に行われる場合、答えは変わりますか?

ありがとうございました。必要なデータをすべて入れてほしい。知らない場合はお知らせください。追加します。

12
bshender

すべてを考慮すると、オプション2を使用します。日付は均等に選択されますが、特定のクエリでは、1つまたは2つの日付パーティションのみが関係していると推測します。これは、理想的には、地理位置情報でクラスター化したり、日付でパーティション分割したりできないのは残念です。境界ボックスが十分に小さい場合、高度はいずれにせよ地理位置情報と相関する傾向があります。

利用可能な選択肢を考えると、よりクリーンなデータ操作と毎日のバキュームを回避することは良いことです。

オプション1を使用すると、selects mayの配信が速くなりますが、おそらくウォッシュになるでしょう。オプション1では、同じ日付と標高のレコードが1つの大きなクラスター化インデックス内で互いに近くに配置されます。オプション2では、同じ日付と標高を持つレコードが、多くの小さなクラスター化インデックスで互いに近くに配置されます。

1
Carlos Bueno