12.
VACUUMとは…の前に
PostgreSQLは追記型アーキテクチャを採用しています。
➢データの変更があっても元のレコードを物理的に消さず、新しい行を追加
して、元のレコードを無効とマークします。
12
ID NAME
1 test1
2 test2
3 test3
ID NAME
1 test1
2 test2
3 test3
2 test2’
3 test3’
UPDATE
UPDATE tablename SET
NAME=test2’ WHERE ID = 2;
!
UPDATE tablename SET
NAME=test3’ WHERE ID = 3;
:不要領域
:ページ
13.
VACUUMとは
VACUUMは、不要領域を再利用可能にし、その箇所をFSM(空き領域マップ)に登録するコマンド
です。
13
ID NAME
1 test1
2 test2
3 test3
2 test2’
3 test3’
VACUUM実行
VACUUMにより!
不要領域回収
:不要領域
:ページ
ID NAME
1 test1
2 test2
3 test3
2 test2’
3 test3’
ID NAME
1 test1
2 test2’
3 test3’
VACUUM完了
再利用可能に!
14.
VACUUMとVACUUM FULL
✦ VACUUMは、不要領域を再利用可能な状態にします。
✦ VACUUM FULLは、物理的にファイルを圧縮します。
‣ 排他ロックが必要なため、VACUUM FULL中はテーブルへアクセス不可
14
:不要領域
:ページ
ID NAME
1 test1
2 test2
3 test3
2 test2’
3 test3’
VACUUM
VACUUM
FULL
ID NAME
1 test1
2 test2’
3 test3’
ID NAME
1 test1
2 test2’
3 test3’
物理的に!
サイズ縮小
SHARE UPDATE!
EXCLUSIVE
ACCESS!
EXCLUSIVE
18.
HOT
HOT(Heap OnlyTuple)は、テーブルデータの更新時にインデックスデータの更新をスキップで
きる仕組みです。これにより、以下のメリットが生まれます。
1. インデックスデータの更新が無いため、更新処理そのものが高速化
2. 更新済みデータ(ガベージ)は、VACUUMを待たずして再利用可能領域化できる
UPDATE tbl SET 在庫= 99 WHERE ID=2
ID 名前 在庫
1 A 10
2 B 8
索引
ID 名前 在庫
1 A 10
2 B 8
2 B 99
索引
ID 名前 在庫
1 A 10
2 B 8
2 B 99
索引
~ 8.2 8.3~VACUUMが実行され
るまで不要領域は再利
用不可
インデックスも更新される
VACUUMを待たずに不要
領域を再利用可能!
→不要領域の増加を抑制
転送エントリを利用すること
で、インデックスの更新を回避。
これにより、VACUUMが改修すべきガベージの量を大幅に削減でき、これによ
り頻繁に更新が走るテーブルへのVACUUM回数が削減。
53.
とある日のpgsql-performanceへのメール(2012/11/29)
!
<VACUUM FULLのあとIndex Only Scanをすると遅くなる>
After vacuum:
Index Only Scan using i on ta (cost=0.00..50882.62 rows=2018667 width=4)
(actual time=0.014..193.120 rows=2000000 loops=1)
Index Cond: (ca = 1)
Heap Fetches: 0
!
After vacuum full:
!
Index Only Scan using i on ta (cost=0.00..155991.44 rows=1990333 width=4)
(actual time=0.042..364.412 rows=2000000 loops=1)
Index Cond: (ca = 1)
Heap Fetches: 2000000
53
Be the first to comment