バックグラウンド
ローカルデータベースには、約13億の一意の行が含まれています。各行は、特定の緯度と経度(場所)に間接的に関連付けられています。各行には日付スタンプがあります。
使用事例
問題は次のとおりです。
- ユーザーは、開始/終了日と値の範囲(たとえば、100から105)を設定します。
 - システムは、特定の日付に一致するすべての行を、場所ごとにグループ化して収集します。
 - システムは、これらの日付の間に、指定された値の範囲に該当する可能性がある場所を決定します。
 - システムは、一致するすべての場所をユーザーに表示します。
 
これは速度と規模の問題です。
質問
そのようなシステムが5秒未満でユーザーの結果を取得できると想像できる最も安価なソリューションアーキテクチャは何ですか。
現在のシステム
現在の環境は次のとおりです。
- PostgreSQL 8.4(アップグレードは可能です。データベースの切り替えはオプションではありません)
 - RおよびPL / R
 - XFS
 - WD VelociRaptor
 - 8 GB RAM(Corsair G.Skill; 1.3 GHz)
 - クアッドコア本物のインテル7(2.8 GHz)
 - Ubuntu 10.10
 
ハードウェアのアップグレードは許容されます。
更新-データベース構造
数十億行が次のようなテーブルにあります。
id | taken | location_id | category | value1 | value2 | value3
- id-主キー
 - 取られた-行に割り当てられた日付
 - location_id-緯度/経度への参照
 - カテゴリ-データの説明
 - value1 .. 3-ユーザーがクエリできるその他の値
 
takenカラムは、典型的にはあたり連続日付でlocation_id時々各位置1800から2010年までのデータを有し、(各位置は、同じ日付範囲のデータを有するよう77,000約日付が、それらの多くが重複)。
7つのカテゴリがあり、テーブルはすでにカテゴリ別に分割されています(子テーブルを使用)。各カテゴリには、1億9000万行が含まれます。近い将来、カテゴリごとの行数は10億を超えるでしょう。
約20,000の場所と70,000の都市があります。場所は、緯度と経度によって都市に関連付けられています。各場所を特定の都市に割り当てることは、都市の境界を見つけることを意味しますが、これは簡単な作業ではありません。
アイデア
私が持っているいくつかのアイデア:
- データベースをホストするクラウドサービスを見つけます。
 - SSD RAIDストライプを作成します(素晴らしいビデオ)。
 - 都市ごとにすべての場所を統合するテーブルを作成します(事前計算)。
 
ありがとうございました!