5.10. オブジェクト識別子データ型

オブジェクト識別子 (OID) は PostgreSQL の内部でさまざまなシステムテーブルのプライマリキーとして使用されます。 また、OID システム列がユーザ作成のテーブルに追加されます (テーブルの作成時に WITHOUT OIDS が指定されていない場合)。 データ型 oid はオブジェクト識別子を表します。 oid には別名もいくつかあります。 regprocregprocedureregoperregoperatorregclass、および regtype です。Table 5-20 に概要を示します。

oid データ型は現在、符号なしの 4 バイト整数として実装されています。 これは、大規模なデータベースの全体にわたって一意とするには十分ではありません。大規模な個別のテーブル内においても十分ではないかもしれません。 そのため、ユーザ作成テーブルの OID 列をプライマリキーとして使用するのはお勧めできません。 OID の使用は、システムテーブルへの参照の場合にのみ推奨されます。

oid データ型自体は、比較 (符号なし比較として実装) 以外の演算はほとんど行いません。 整数としてキャストすることもできますが、その場合標準の整数演算子が使用されます。 (これを行うと、符号つきと符号なしの間で混乱が起きかねないことに注意してください。)

oid 別名データ型自体は、専用の入力および出力ルーチン以外には演算を行いません。 これらのルーチンでは、oid 型が使用するような未加工の数値ではなく、システムオブジェクト用のシンボリック名を受け入れたり表示したりできます。 別名データ型により、オブジェクトの OID 値の検索が簡単になります。 たとえば、テーブル mytable の OID を取得するために、SELECT oid FROM pg_class WHERE relname = 'mytable' の代わりに 'mytable'::regclass と記述できます。 (現実には、異なるスキーマに mytable テーブルが複数ある場合には、正しい OID を選択するために、より複雑な SELECT が必要となります。)

Table 5-20. オブジェクト識別子データ型

型名参照説明値の例
oidany数値オブジェクト識別子564182
regprocpg_proc関数名sum
regprocedurepg_proc引数の型を指定した関数sum(int4)
regoperpg_operator演算子名+
regoperatorpg_operator引数の型を指定した演算子*(integer,integer) or -(NONE,integer)
regclasspg_classリレーション名pg_type
regtypepg_type型名integer

すべての OID 別名型はスキーマ修飾名を受け入れ、修飾しないと現在の検索パスでオブジェクトを見つけられない場合は、出力時にスキーマ修飾名を表示します。 regprocregoper の別名型は、一意の (オーバーロードしていない) 入力名のみを受け入れるため、これらの使用には限度があります。ほとんどの場合、regprocedure または regoperator を使用するのが適切です。 regoperator の場合、単項演算子は未使用のオペランドを NONE と記述することによって指定されます。

OID は 32 ビット長であり、クラスタ全体で 1 つのカウンタから割り当てられます。巨大な、または、長期間運用しているデータベースでは、カウンタが一周する可能性があります。従って、OID が一意であることを前提とすることは、OID を一意にすることを保証する手段を講じていない限り非現実的です。OID を使用して行の識別を行う推奨方法は、その OID が使用される各テーブルの OID 列に一意性制約を作成することです。テーブルを跨いで OID の一意性を前提としてはいけません。 もしデータベース全体の識別子を必要とするのであれば、tableoid と 行 OID の組み合わせを使用して下さい。PostgreSQL の将来のリリースではテーブル毎に OID カウンタを分割する予定です。 そのため、tableoid は全体的な一意的識別子になるように含められる必要があります。

システムが使用するもう 1 つの識別子の型は xid、すなわちトランザクション (略して xact) 識別子です。 これは、システム列 xmin および xmax のデータ型です。トランザクション識別子は 32 ビット長です。長期間運用されているデータベースでは、トランザクション ID が一周する可能性があります。 これは適切な保守手順を行うことで致命的な問題にはなりません。詳細は PostgreSQL 7.3 管理者用ガイド を参照して下さい。しかし、長期間(100 万トランザクション以上)に渡って、トランザクション識別子の一意性に依存することは良い方法とはいえません。

システムが使用する 3 つ目の識別子は cid、すなわちコマンド識別子です。 これは、システム列 cmin および cmax のデータ型です。コマンド識別子も 32 ビット長です。 これにより、1 つのトランザクション内の SQL コマンド数の上限 232 (400万) が発生します。 実際にはこの制限は問題にはなりません。これが 処理タプル数ではなく SQL コマンド数に関する制限であることに注意して下さい。

システムが使用する最後の識別子は tid、すなわちタプル識別子です。 これは、システム列 ctid のデータ型です。 タプル ID は、テーブル内のタプルの物理的位置を識別するための組 (ブロック数、ブロック内のタプルインデックス) です。