[pgsql-jp: 40241] Re: トランザクション ID の最大値

Takahiro Itagaki itagaki.takahiro @ oss.ntt.co.jp
2010年 3月 29日 (月) 09:56:56 JST


tanaka <tanaka_hideo @ yahoo.co.jp> wrote:

> 1. age() は、元々 日付関数ですが、なぜ、xid をage()関数を使用して表現す
> るのでしょうか?

引数が日付とXIDとで異なる関数としてオーバーロードされています。
=# \df age
                                                    関数一覧
  スキーマ  | 名前 | 結果のデータ型 |                      引数のデータ型                      |       型
------------+------+----------------+----------------------------------------------------------+----------------
 pg_catalog | age  | interval       | timestamp with time zone                                 | normal(通常)
 pg_catalog | age  | interval       | timestamp with time zone, timestamp with time zone       | normal(通常)
 pg_catalog | age  | interval       | timestamp without time zone                              | normal(通常)
 pg_catalog | age  | interval       | timestamp without time zone, timestamp without time zone | normal(通常)
 pg_catalog | age  | integer        | xid                                                      | normal(通常)
(5 行)

> 2. なぜ、マイナスが未来を表すのでしょうか?(マイナスが未来を表す事に決め
> たのでしょうか?)

そういう定義ですね。過去がプラス、現在がゼロなので、未来がマイナスになるのは
自然だとは思います。日付関数版も、未来だとマイナスの値が返りますね。

=# SELECT age(timestamp '2011-03-29');
   age
----------
 -1 years
(1 行)

> 3. トランザクションIDの周回は、過去と未来が逆転してしまうので、周回が発生
> しないように定期的にvacuumを実行する必要がある という事でしょうか?

はい、その通りです。「トランザクションIDの周回エラーの防止」に説明があります。
    http://www.postgresql.jp/document/8.1/html/maintenance.html#VACUUM-FOR-WRAPAROUND
8.1 だと、周回が迫ると VACUUM 以外のSQL を受け付けなくなって、サービスが
停止してしまうのでご注意を。バージョン 8.2 以降であれば、周回しそうになると
勝手に autovacuum が起動して、自動的に周回エラーを防止してくれます。

------------------------------------------------------------
NTT オープンソース ソフトウェア センタ
板垣貴裕 <itagaki.takahiro @ oss.ntt.co.jp>




pgsql-jp メーリングリストの案内