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が作成されていることを確認。
以上