PostgreSQLでoidを節約する方法とは?

このQ&Aのポイント
  • - PostgreSQLでoidを節約する方法について知りたいです。
  • - oidがいくつ消費されるのか計算方法を教えてください。
  • - バイナリデータを管理するためのoidはどれくらいの範囲で使用されるのでしょうか。
回答を見る
  • ベストアンサー

PostgreSQLで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を消費するか、計算方法を教えてください。 あるいは、何か勘違いをしていましたらご指摘いただけますと助かります。

  • dio16
  • お礼率47% (9/19)

質問者が選んだベストアンサー

  • ベストアンサー
  • nora1962
  • ベストアンサー率60% (431/717)
回答No.1

http://d.hatena.ne.jp/higepon/20090310/1236668808 現状では対処不可のようです。(オフィシャルでは) PostgreSQLのOIDが64nitになるのを待つしかないですかね。

dio16
質問者

お礼

情報有難う御座います。 同じことを考えた人がいたんですね。 外部LOBにするとか、何か他の方法を考えます。

関連するQ&A

  • お世話になります。

    お世話になります。 sql loaderでpostgresqlのbytea型のデータをoracleのraw型にどう取り込むか困っていますが bytea型のデータは8進数のエスケープされた文字(\\313\\314\\263\\244)ですが、raw型のほうは バイナリデータしか入れない仕様なんですが、 どう変換するか、どの関数を使えば、うまく行ける方法をご存知の方がいらっしゃいましたら、是非お願いいたします。

  • PostgreSQLの列分割(水平分割)について

    PostgreSQLで次のテーブルを作るとして create table test1(id int , name text , pass text , img bytea , dates date); このテーブルをパーティショニングしたいと思っています。 水平分割(dates列の値によって行をパーティショニング)についてのSQL文は、公式ドキュメントに例示されていたため理解したのですが、 垂直分割(列自体を分割)する設計のテーブルを作成する場合について調べているのですが、見つけることができませんでした。 id,name,pass,dateのテーブルと、id,imgのテーブルにパーティショニングするSQL文についてご教授願えないでしょうか

  • PostgreSQLサーバー。

    今回、自宅でプログラミングの勉強をする上で、DBの課題ができ、PostgreSQLをインストールできずに困っています。 課題といたしましては→テーブルを作成し、そのテーブルに対して検索した結果を表示するServletを作成することです。 そして、サンプルデータをAccessに置き、PostgreSQLとAccessをODBCで繋ぐ事です。 その第1段階といたしまして、PostgreSQLをWebサーバーにインストールする事です。  自分でも、HPなどで結構調べたのですが、自分の環境の、 OS----------------Win98 Webサーバー ------JRun に合う、PostgreSQLサーバーが探し出せないのです。 どなたか、詳しい方宜しくお願いします。

  • ExcelにPostgreSQLのデータを取り込むには

    以下のサイトを参考にして、ODBC接続によるExcelへのPostgreSQLデータ取り込みを試みました。 「PostgreSQL ODBCによるアプリケーション接続」 http://allabout.co.jp/internet/database/closeup/CU20050219A/index.htm 「2. ExcelにPostgreSQLのテーブルのデータを取り込む手順」 http://allabout.co.jp/internet/database/closeup/CU20050219A/index2.htm ODBCの設定自体はたぶんうまくいったと思うのですが、いざExcelからPostgreSQLを取り込もうとすると、「このデータソースには表示できるテーブルがありません」というメッセージが表示されてしまいます。 接続先のDBには、テーブルは存在しています。 試しに、Accessでも以下のサイトの手順で試して見ましたが、「テーブルのリンク」画面に対象となるテーブルが1件も表示されません。 「3. AccessにPostgreSQLのテーブルのデータを取り込む手順」 http://allabout.co.jp/internet/database/closeup/CU20050219A/index3.htm テーブルとのリンクをはるために他にも何か設定は必要でしょうか? PostgreSQLは8.0.1、Officeは2003を使用しています。 接続は自分のPC内にあるOfficeから同じく自分のPC内にあるPostgreSQLへ接続しに行こうとしています。 よきアドバイスをいただけると助かります。 以上、よろしくお願いいたします。

  • PostgreSQLのラージオブジェクトを使って画像を表示したい

    現在、PostgreSQL+PHPで画像管理DBを作成しています。 開発環境は、 Solaris8 Apache1.3.12 PostgreSQL7.1.3 PHP-4.1.0 で行っています。 今、PostgreSQLのラージオブジェクトを使用して画像(JPEG)のDBへの登録及び画面に表示するところを作っているのですが、PHPのスクリプトを作成してWeb上から動作確認を行ったところ、画面に以下の文字が表示されました。 =====表示される文字列===== ・・JFIF,,・厥hotoshop 3.08BIM,, ・'File written by Adobe 屯胖7GWgwt6Х牌范 : ========================= 多分、画像(JPEG)のバイナリがそのまま出力されていると思われます。 これは、PHPの問題なのでしょうかそれとも、DBへの登録が失敗したのでしょうか? 教えていただけないでしょうか?また、 PHP4.1.0+PostgreSQL7.1.3の環境で画像管理DBのなにかサンプルがあれば教えてください。

    • 締切済み
    • PHP
  • PostgreSQLで日付範囲内の日付を全 て取得する方法

    PostgreSQLに、 2003/01/01~2003/05/10などの範囲の日付を 全て取得するSQLはありますでしょうか? 以下のような結果(日付リスト)を取得したいのですが、 DBには、日付カラムは存在しません。 PostgreSQL自体に日付を管理しているテーブルなどがあれば、それにアクセスできれば可能そうなのですが・・・ 2003/01/01 2003/01/02 2003/01/03 ・ ・ ・ 2003/05/10 よろしくお願いします。

  • PostgreSQL 7.2.8 異なるデータベース間のテーブル

    こんにちは。かなり困っています、よろしくお願いします>< PostgreSQL 7.2.8 を使用しています。 一つのユーザーで、二つのデータベースがあります。 それぞれ同じカラムを持つ同じ名前のテーブルがあります。 中のデータは違います。 db1 - tableT db2 - tableT 条件を付けて、db1のtableTのデータを db2のtableTへコピーするにはどのような方法がありますか? 例えば select * from db1.tableT tbl1, db2.tableT tbl2 where tbl1.title = tbl2.title; のようにしてとりあえずselectで試してみましたがダメでした。 やはりスキーマとデータベースは違うんですね>< ドットが認識されませんでした。 どなたか解決法をご存知の方、よろしくお願いします。

  • Linux上のpostgreSQLデータをWindowsでみたい

    サーバA(OS:Linux Fedora Core 4、データベース:PostgreSQL 8.0 で運用しているシステムがあり、毎日そのデータを下記のdumpコマンドで PostgreSQLの全データをバックアップしています pg_dumpall > postgres.out  サーバAを触るのは怖いので、別のマシンB(Windows-Xp)に postgresql-8.2.6をインストールしました。 このバージョンは、postgresqlとともに、pgAdmin3というGUIの管理 ツールもついていると聞きここに、サーバAからバックアップされている postgres.outをrestoreして pgAdmin3でデータベース・テーブル等をみようとしています (postgres.out)を使ってのリストアの仕方は (1)(postgres.out)をpostgresqlの/binディレクトリの中に入れる (2)psqlのメニューから次のコマンドを打つ psql -d manmg -f postgres.out   (3)pgAdmin3を立ち上げるとサーバAのDBは追加されているようなのですが  テーブルは(0)となって見えません マシンBの方のPostgreSQLについてはインストールしたままでサーバA のpostgresqlの設定等は何もしていません 何か設定する所はあるのでしょうか 上記手順でlinuxから吐出されたバックアップデータをWindowマシンに リストアする方法は間違っていないのでしょうか よろしくお願いします。

  • PostgreSQLで外部DB内のテーブル参照方法を教えてください

    PostgreSQLで別データベースのテーブルを参照することはできますか? 仮に以下のデータベースが2つあるとします CREATE DATABASE common_db ... CREATE DATABASE app1_db ... app1_db に接続した状態で common_db のテーブルを参照することはできますか? 仮にcommon_dbに郵便番号テーブル postcodeがあるとします CREATE TABLE postcode ( postcode text, --郵便番号 pref_name text, -- 県名  ・・・ ) このpostcodeテーブルをapp1_dbに接続した状態で参照するには、どのような参照クエリになりますか? ご教授の程よろしくお願います。 そもそもできないのでしょうか?

  • 勤怠管理 コアタイムのデータ管理 Java & PostgreSQL

    Java+PostgreSQLを使い、勤怠管理システムを作成中です。 システムではコアタイムを複数設定でき、環境にあわせた勤怠管理が できるようにしたいです。 従業員の勤怠集計はコアタイムを基準に、早出、基本時間、遅刻、残業を 算出できるようにしたいです。 現在、DBスキーマとテーブルに対応するJavaエンティティの定義を進めて いますが、型をどのようにすれば集計が楽になるかわからず困っています。 悩んでいるのが、日付をまたいだコアタイムを設定するとき、PostgreSQLの time型では23:59を超える時刻を扱えないため、 開始 > 終了 という データを登録する必要があり、計算が複雑になることです。 考えているものとしては、2つあります。 1) PostgreSQLの型:time Javaの型:java.sql.Time 2) PostgreSQLの型:integer(分であらわす。9:00であれば、540) Javaの型:Integer(分であらわす。9:00であれば、540) 1)は前述での計算が複雑になる問題があり、2)は、やり方がスマートでは ないような気がします。 どのような定義にすれば妥当でしょうか。 アドバイスや過去の事例等あれば、ご教授下さい。