1

Greenplum のさまざまなクエリ タイプの最適なパーティショニング/インデックス作成のための適切な戦略を定義するための一般的なガイドライン (試行錯誤を超えて) があるかどうかを知る必要がありますか?

Greenplum は管理ガイドにいくつかのアドバイスを提供しています...しかし、真実は、それはほぼ postgres ドキュメントからのコピーペーストであり、そのアドバイスの一部は明らかなように見えますが (IE: テーブルが大きすぎてメモリに収まらない場合のパーティション)、それはこれを達成するための優れた戦略を定義するには十分ではありません。

通常、Greenplum データベースには非常に大きなテーブル (数百 GB を超える範囲) があり、ハードウェアはこの種の使用のために特別に選択されていますが、ほとんどの場合、非常に大きなデータベースになると問題に遭遇しました (IE: かつてデータベースがあった60 フィールドのテーブルと 2 億行を超える行があり、そのサイズは 1 日あたり 400 万から 800 万のレジストリで増加し続けています)。

適切なパーティションを選択するには、ほぼ同じサイズ (日付範囲など) で区切られる予測可能な範囲を選択するなど、いくつかの手法があることを知っています。しかし、他のデータベースではインデックスに頼ろうとしますが、Greenplum は、インデックスがまったく使用されないように、ランダム ページ コストなど、いくつかの設定により大きな重みを与えることで、それらを完全に思いとどまらせるという事実もあります。

しかし、これが完全に非生産的であるいくつかの状況を読みました: GP によると、テーブルが 192 を超えるまでパーティション分割を行うべきではありませんが、インデックスが使用されていないため、それぞれ 64GB RAM の 3 つのノードがあるとします。ノードあたり最大 64 GB の seq スキャン! --- これでも高速ですが、インデックスの使用を強制すると、20 秒以上からわずか数ミリ秒に短縮できます。

もう 1 つの既知のケースは、パーティショニング時に、オーバーヘッドによりクエリが本来よりも大幅に遅くなるというものです。

それでは、元の質問に戻り
ます。パーティショニング/インデックス作成戦略を定義する方法について、適切で確固たるアドバイスはありますか?
一部の ETL では、ソースからのテスト クエリに 30 分から 1 時間かかることがあるため、試行錯誤によって生産性が大幅に低下します。

ありがとう。

4

1 に答える 1

0

あなたの質問への答えは、数学ではなく、ユーザーがどのようにテーブルにアクセスするかにかかっていると思います。日付範囲パーティショニングの場合、ユーザーが通常 1 日分のデータを探す場合、日単位のパーティションが理にかなっています。ユーザーが通常より長い日付範囲でクエリを実行する場合、日単位のパーティションはオーバーヘッドを追加するだけです。Greenplum DB テーブルの各パーティションまたはサブパーティションは個別のテーブル (したがって、ファイルシステム上の個別のファイル) として扱われるため、クエリを満たすためにスキャンする必要があるパーティションが増えるほど、アクセスする必要があるオープン ファイルが増えます。ユーザーがどのようにデータにアクセスしたいかを理解すると、考えられるパーティション戦略についてより良い手がかりが得られます。

ハイブリッド パーティショニング戦略も有効です。特定のユース ケースでは、最近の週/月の毎日のパーティションがあるテーブルを優先し、古いパーティションはアクセス頻度が低いため、通常はレポート/分析クエリと行ルックアップなどのために、より長い時間枠をカバーします。

インデックス作成に関する限り、Greenplum DB のオプティマイザはインデックス アクセスよりもテーブル スキャンを優先しますが、インデックスが意味を持つ場所があります。場合によっては、ビットマップ インデックスでうまくいったこともあります。

残念ながら、GPDB のチューニングは他のデータベースと同様にまだ芸術的な形式であるため、ある程度の試行錯誤は避けられないでしょう。

于 2013-04-22T01:20:01.120 に答える