PostgreSQLスキルアップノート(自己啓発のための個人サイト)

可視性マップ(vm:Visibility Map)とは


【一覧に戻る】
マニュアルへのリンクは/9.2/としています。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■■■■ PostgreSQL スキルアップノート
■■■■
■◆■■ 可視性マップ(vm:Visibility Map)とは
■■■■
■■■■
■■■■ 使用環境:PostgreSQL9.2.3 (CentOS6.2)
         2013/03/17
                                                                   (C) 2013 ohdb
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

可視性マップはバキューム処理の負担軽減のために8.4から追加された。
9.2からはこの情報を使ってインデックスオンリースキャンが実現できるようになった。


【マニュアル】

第56章データベースの物理的な格納/可視性マップ→●[マニュアル]

付録 E. リリースノート
 8.4のリリースノート→●[マニュアル]
 9.2のリリースノート→●[マニュアル]

【マニュアル参考】

第23章定常的なデータベース保守作業/定常的なバキューム作業→●[マニュアル]


【その他】
  −




■1■ 可視性マップ(VM)とは
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

56章データベースの物理的な格納/可視性マップ→●[マニュアル]

・すべてのトランザクションから可視(見える状態)かどうかをページ単位でビットで持つ。
・1ページ1ビットのコンパクトな情報。



■2■ 可視性マップ(VM)はどこにあるのか?
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

  ファイルノード_vm 

の名前でテーブル1個につき一つ、単独のファイルで持っている。


なお、データ側のページに関する情報なので、インデックスの_vmファイルというものはない。




■3■ 可視性マップ(VM)は何の目的で使われるのか? 
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

 目的は2つ。

・バキューム処理が負荷軽減のために使う・・・これは8.4から
  バキューム処理がビットをみてスキップしていく。
   →●[マニュアル]

・インデックスオンリースキャンによるアクセス高速化のために使われる ・・・これは9.2から
  ビットが立っている場合は、ヒープ(行データ)へのアクセスをスキップ。

  従来は、インデックスだけで結果が分かるものであっても必ずデータ(ヒープ)へのアクセスが発生したいた。
  9.2からのインデックスオンリースキャンは、インデックスアクセスだけで済むような場合、ヒープへのアクセスが発生しなくなった。
   →●[マニュアル]




■4■ 可視性マップ(VM)のビットの意味
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

・ビットが立っている場合・・  そのページ内の行すべてが誰からも可視な状態。、
・ビットが立っていない場合・・  誰かにとって可視でない行が含まれる「可能性」がある。


・ビットを立てるのはバキューム処理
  「そのページ内の行はすべて誰からも可視である」 という保証がついたことになる。

・ビットをクリアするのは各処理
   「そのページ内の行がすべて可視」とは保証できない状態になる。


ただし、普通のDBAがビットの状態を自分で解析したりするようなことはない(?)と思う。






■参考■ ファイル実体を確認
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

【□】 psql database1 dba01

【□】 テーブル空間pg_default($PGDATA/base)にt1テーブルを作成。

drop table public.t1;
create table public.t1 (c1 text) tablespace pg_default;
create index t1index on public.t1(c1)  tablespace pg_default;
insert into public.t1 values('aaa');
\q


【□】 oid2name 

    Oid  Database Name    Tablespace
------------------------------------
  16388★    database1  tablespace01
  16389      database2  tablespace02
  12870       postgres    pg_default
  12865      template0    pg_default
      1      template1    pg_default

・・database1のoidは16388


【□】 oid2name -d database1 -x

  Filenode  Table Name    Oid  Schema  Tablespace
-------------------------------------------------
     16432          t1  16432  public  pg_default


・・テーブルt1のFilenodeは16432


【□】 ls -l $PGDATA/base/16388/16432*

-rw------- 1 postgres postgres 8192  3月 14 21:01 2013 /db1/pgsql/data/base/16388/16432

・・・可視性マップはまだ作成されない。


【□】 psql database1 dba01 

【□】 VACUUM t1;

【□】 \q


【□】 ls -l $PGDATA/base/16388/16432*

-rw------- 1 postgres postgres  8192  3月 14 21:02 2013 /db1/pgsql/data/base/16388/16432
-rw------- 1 postgres postgres 24576  3月 14 21:02 2013 /db1/pgsql/data/base/16388/16432_fsm
-rw------- 1 postgres postgres  8192  3月 14 21:02 2013 /db1/pgsql/data/base/16388/16432_vm★


可視性マップ_vmが作成されていることを確認。





以上 
inserted by FC2 system