6

私が持っているもの:

  • 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」テーブルを検索する必要がないため、データをはるかに高速にインポートできます。

誰かアドバイスをいただけますか?ありがとう!

4

3 に答える 3

12

パーティショニングは、プランナーがほとんどの時間でほとんどのパーティションへのアクセスをスキップできるようにするほとんどのクエリに選択基準がある場合、またはパーティションに割り当てられているすべての行を定期的にパージする場合に最も役立ちます。両方とも。(テーブルを削除することは、多数の行を削除するための非常に高速な方法です!)パーティション分割によってインデックスを浅く保ち、パフォーマンスを向上させるしきい値に達する人の話を聞いたことがあります。しかし、実際には、インデックスツリーの最初のレベルを別の場所に効果的に移動するため、最初のポイントに戻ります。それでも発生する必要があります。

一見すると、パーティショニングが役立つようには思えません。

一方、正規化は、予想以上にパフォーマンスを向上させる可能性があります。これらすべての行を狭くすることで、各ページにより多くの行を取り込むことができ、全体的なディスクアクセスを減らすことができます。私は適切な第3正規形の正規化を行い、それが役立つという証拠に基づいてそれから逸脱するだけです。データの2番目のコピー用のディスク容量が残っているときにパフォーマンスの問題が発生した場合は、非正規化テーブルを作成して、正規化バージョンと比較してパフォーマンスを確認してみてください。

于 2012-05-03T15:00:23.877 に答える
1

ユースケースにもよりますが、それは理にかなっていると思います。30Bの行履歴がどれくらい前にさかのぼるかはわかりませんが、トランザクションデータベースが決定したパーティションの数を超える必要がない場合は、パーティションを作成することは理にかなっています。

たとえば、一度に2か月分のデータのみをクエリする場合は、月ごとのパーティション分割が最適です。1年の残りの10か月は、トランザクションストアを小さく保ちながら、レポートウェアハウスに移動できます。

パーティションで使用できるフィールドには制限があります。あなたはそれらに注意しなければならないでしょう。

パフォーマンスベースラインを取得し、パーティションを作成し、再測定してパフォーマンスへの影響を確認します。

于 2012-05-03T13:41:45.057 に答える
0

与えられた量のデータを念頭に置いて、あなたは主にIOを待っているでしょう。可能であれば、シナリオに最適なIO値を取得するために、さまざまなHW構成でいくつかのテストを実行してください。私見、舞台裏で何か他のものがない限り、2枚のディスクはしばらくすると十分ではありません。

あなたのテーブルは、既知の比率で毎日成長します。そして、おそらくそれは毎日照会されます。パージされるデータについては言及していませんが(パージされる場合、パーティションを作成してください)、これはクエリの実行が毎日遅くなることを意味します。ある時点で、クエリを最適化する方法を検討し始めます。可能性の1つは、アプリケーションレベルでクエリを並列化することです。ただし、ここではいくつかの条件を満たす必要があります。

  • クエリを並列化するには、テーブルをパーティション化する必要があります。
  • HWは、要求された量のIOをN個の並列ストリームで配信できる必要があります。

すべての答えは、さまざまなセットアップのパフォーマンステストによって与えられる必要があります。

また、他の人が述べたように、パーティション化されたテーブルにはDBAの方が多くの利点があるため、個人的には、日、週、月など、間隔ごとに500万行を超えると予想されるテーブルをパーティション化することにします。

于 2012-05-03T15:20:20.937 に答える