PostgreSQLテーブルには大きすぎますか?


127

私は会社のRoRプロジェクトの設計に取り組んでおり、私たちの開発チームは、設計、具体的にはデータベースについて、少々議論を交わしています。

Message永続化する必要のあるというモデルがあります。これは、id以外にdb列が3つしかない非常に小さなモデルですが、本番環境に移行すると、これらのモデルが大量に存在する可能性があります。1日に最大100万件の挿入が見られます。モデルは、インデックスを作成できるモデル上の2つの外部キーによってのみ検索されます。また、モデルを削除する必要はありませんが、約3か月経過したモデルを保持する必要はありません。

では、このテーブルをPostgresに実装するとパフォーマンスに重大な問題が発生するのではないかと思います。これが問題になるかどうかを教えてくれる非常に大規模なSQLデータベースの経験がある人はいますか?もしそうなら、私たちはどの代替案を使うべきですか?


3
良いキャッシングレイヤーとPGのいくつかの小さな設定で、大丈夫です。ケースバイケースでパフォーマンスの問題に取り組み、事前最適化を回避する必要があります。とはいえ、パーティション化と複製は常にボトルネックにぶつかったときに利用できる優れたオプションです。
サム


5
私たちは1つの5 TB以上のPostgreSQLデータベースで1日あたり約3,000万のメッセージを処理し、正常に動作します。
フランク・ハイケンズ2014


1
ちなみに、私はたまたま今日postgresql.org/aboutを読んでいて、(原則として)テーブルの行数は無制限であると書いてあることに気づきました。
Al Chou

回答:


115

テーブルごとの行は、それ自体では問題になりません。

つまり、1日あたり100万行を90日間とすると、9千万行になります。Postgresがこれに対処できない理由はないと思います。

データの分散に応じて、インデックス、フィルター処理されたインデックス、および何らかの種類のテーブルパーティションを組み合わせて使用​​することで、パフォーマンスの問題が発生する場合と発生しない場合に、速度を上げることができます。あなたの問題は、私が知っている他のどのRDMSでも同じです。データを削除するプロセスで3か月分のデータ設計のみが必要な場合は、これ以上必要ありません。これにより、テーブルに一定量のデータが含まれます。幸運なことに、どれだけのデータが存在するかがわかっているので、ボリュームをテストして、何が得られるかを確認します。9000万行の1つのテーブルをテストするのは、次のように簡単です。

select x,1 as c2,2 as c3
from generate_series(1,90000000) x;

https://wiki.postgresql.org/wiki/FAQ

Limit   Value
Maximum Database Size       Unlimited
Maximum Table Size          32 TB
Maximum Row Size            1.6 TB
Maximum Field Size          1 GB
Maximum Rows per Table      Unlimited
Maximum Columns per Table   250 - 1600 depending on column types
Maximum Indexes per Table   Unlimited

19
9000万行はPostgreSQLでは問題にならないことに同意します。しかし、それ PostgreSQLのORMにとって問題になるかもしれません。(実際には任意のdbmsを使用したORM。)
Mike Sherrill 'Cat Recall'

@ MikeSherrill'Catcall '良い点は、「PostgreSQLのテーブルにはどれくらいの大きさなのか?」
Kuberchaun、2014

2
@yeyo:ORMは通常、多くのクエリを使用して、1つまたは2つで返すことできるデータを取得します。OPはRuby on Railsを使用しています。
マイクシェリル「キャットリコール」

39
これは少し遅いですが、多くの場合(特にrails / activeレコードの場合)、ORMを方程式から完全に削除し、生のSQL文字列を書き込んでパフォーマンス上の理由からクエリを実行するのが一般的だと思います。ORMにデータの決定を任せないでください。それは必須ではないアクセサリーです。
Stefan Theard

2
URLで引用されているabout URLは現在これらの制限を示していません-どこに移動したか知っていますか?
ソーン

58

1億行を超えるテーブルでクエリを大幅に高速化する別の方法は、営業時間外に、クエリで最も頻繁に使用されるインデックスでテーブルをクラスタ化することです。2億1,800万行を超えるテーブルがあり、30倍の改善が見られました。

また、非常に大きなテーブルの場合は、外部キーにインデックスを作成することをお勧めします。


>営業時間外に、クエリで最も頻繁に使用されるインデックスでテーブルをクラスター化します。これがどのように行われるか説明できますか?
スパイ

6
はい、ここにステップバイステップの例があります:1)私が参照しているテーブルは、この例では投資と呼ばれています。2)クエリで最も使用されるインデックスは(bankid、record_date)です。そのため、ステップバイステップは次のとおりです。1)psql -c "drop index Investment_bankid_rec_dt_idx;" dbname 2)psql -c "投資(bankid、record_date);にインデックスInvestment_bankid_rec_dt_idxを作成します。" 3)psql -c "投資のクラスターInvestment_bankid_rec_dt_idx;" 4)vacuumdb -d ccbank -z -v -t Investmentしたがって、ステップ1と2でインデックスを削除して再作成します。
James Doherty、

3
ステップ3クラスターを作成します。これにより、基本的にDBテーブルがインデックスの物理的な順序に配置されるため、postgresqlがクエリを実行すると、最も可能性の高い次の行がキャッシュされます。ステップ4データベースをバキュームして、クエリプランナーの統計をリセットします
James Doherty
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.