※ ChatGPTを利用し、要約された質問です(原文:PostgreSQLでoidを節約する)
PostgreSQLでoidを節約する方法とは?
このQ&Aのポイント
- PostgreSQLでoidを節約する方法について知りたいです。
- oidがいくつ消費されるのか計算方法を教えてください。
- バイナリデータを管理するためのoidはどれくらいの範囲で使用されるのでしょうか。
質問があります。
・PostgreSQLで、oidを節約する方法はあるでしょうか(create tableでWithout OIDSを指定する以外に)
・oidはPostgreSQLが管理上使うらしいのですが、具体的にはどのぐらい消費するか、計算方法はありますでしょうか。
以下、経緯です。
PostgreSQLに大量のバイナリデータを含むデータを登録するようなシステムを作ろうとしています。現在Oracleで動作しているのですが、DBを置き換える計画です。
調べたところ、バイナリデータを入れられる型としてoidとbyteaがありました。
このうちoidは、データを直接レコードに入れるのではなく、データベース全体で一意の番号を使用してバイナリデータを管理するもののようでした。この「一意の番号」というのが4バイト(32bitOSなので)しかなく、さらにこの番号はPostgreSQLも管理上使用するようです。仮に半分がバイナリデータの識別に使えるとして、21億個までデータを入れられる計算です。
充分な数のようにも思いますが、昨今のHDD事情や(1個1KBとして21億個は約2TBです)、OracleのLOBロケーターはバイナリデータの識別だけで20バイト確保されていることと比べると、「4バイト-PostgreSQLの管理使用分」というサイズはどうも不安です。
この制約を回避するためbyteaを使うことにしました。
しかしPostgreSQLにはTOASTという仕組みがあり、データが大きいときは分割して別の仮想的なテーブルに入れられ、その管理には結局oidが使われるというではありませんか。しかもデータは2000バイトづつに分割されてそれぞれにoidが付くという「浪費」っぷりです。
有償DBと比較するのもいかがなものかとは思いますし、何事にも「無限」ということはないのですが、結局バイナリデータがどれだけ入れられるのかが知りたいです。
PostgreSQLは何にどのぐらいoidを消費するか、計算方法を教えてください。
あるいは、何か勘違いをしていましたらご指摘いただけますと助かります。
お礼
情報有難う御座います。 同じことを考えた人がいたんですね。 外部LOBにするとか、何か他の方法を考えます。