私が持っているもの:
- 8つのロジックコア、16 GBのRAM、2x7200rpmドライブのmdadmraid1を備えた1つのxeonを備えたシンプルなサーバー。
- PostgreSql
- 処理するデータがたくさんあります。1日あたり最大3,000万行がインポートされています。
- 時間-複雑なクエリは最大1時間実行できます
テーブルの簡略化されたスキーマ。これは非常に大きくなります。
id| integer | not null default nextval('table_id_seq'::regclass)
url_id | integer | not null
domain_id | integer | not null
position | integer | not null
上記のスキーマの問題は、それを分割する方法について正確な答えがないことです。すべての期間のデータが使用されます(クエリに日付フィルターはありません)。
「domain_id」フィールドでのパーティション化について考えましたが、問題は、各パーティションにいくつの行があるかを予測するのが難しいことです。
私の主な質問は:
パーティションプルーニングを使用せず、古いデータを削除しない場合、データをパーティション化することは理にかなっていますか?
その長所/短所は何ですか?
パーティショニングを行わない場合、インポート速度はどのように低下しますか?
正規化に関連する別の質問:
URLを別のテーブルにエクスポートする必要がありますか?
正規化の長所
- テーブルには、平均サイズが20〜30バイトの行があります。
- 「url_id」での結合は、「url」フィールドでの結合よりもはるかに高速であると想定されています
非正規化の長所
- 各挿入の前に「url」テーブルを検索する必要がないため、データをはるかに高速にインポートできます。
誰かアドバイスをいただけますか?ありがとう!