HybridDB for PostgreSQL列格納テーブル(AOテーブル)の膨張、ゴミ検査と空間収縮
15153 ワード
タブ
PostgreSQL,Greenplum,ごみ検出,膨張,列格納テーブル,gp_appendonly_compaction_threshold
背景
Greenplumはラインストレージ(スタックストレージ)とAOストレージをサポートし、スタックストレージのゴミ回収と膨張検出方法は以下を参照してください.
「Greenplum膨張、ゴミの検出、整理方法-アリ雲HybridDB for PGベストプラクティス」
AOストレージについてはappendonlyであるが,実際にGPはDELETEとUPDATEをサポートしており,削除または更新された行はBITMAPでタグ付けされている.
AOストレージはブロックレベルの組織であり、1つのブロック内のデータの大部分が削除または更新された場合、スキャンの無駄なコストは実際には高い.
AOメーターの膨張、収縮AOメーターをどうやってチェックしますか?
テーブルのストレージ構造の表示方法
pg_class.relstorageは、このオブジェクトがどのようなストレージであるかを示します.
postgres=# select distinct relstorage from pg_class ;
relstorage
------------
a -- AO
h -- heap 、
x -- (external table)
v --
c -- AO
(5 rows)
現在のデータベースのAOテーブルを問い合せます.
postgres=# select t2.nspname, t1.relname from pg_class t1, pg_namespace t2 where t1.relnamespace=t2.oid and relstorage in ('c', 'a');
nspname | relname
----------+-------------------
postgres | tbl_tag
postgres | tbl_pos_1_prt_p1
postgres | tbl_pos_1_prt_p2
postgres | tbl_pos_1_prt_p3
postgres | tbl_pos_1_prt_p4
postgres | tbl_pos_1_prt_p5
postgres | tbl_pos_1_prt_p6
postgres | tbl_pos_1_prt_p7
postgres | tbl_pos_1_prt_p8
postgres | tbl_pos_1_prt_p9
postgres | tbl_pos_1_prt_p10
postgres | tbl_pos
postgres | xx_czrk_qm_col
postgres | ao1
(14 rows)
現在のデータベースにどのようなヒープ・テーブルがあるかを問い合せます.
select t2.nspname, t1.relname from pg_class t1, pg_namespace t2 where t1.relnamespace=t2.oid and relstorage in ('h') and relkind='r';
AOテーブルの膨張率(ゴミの量)を確認
この関数を用いてAOテーブルの膨張率を調べることができる.
postgres=# \df+ gp_toolkit.__gp_aovisimap_compaction_info
List of functions
-[ RECORD 1 ]-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Schema | gp_toolkit
Name | __gp_aovisimap_compaction_info
Result data type | SETOF record
Argument data types | ao_oid oid, OUT content integer, OUT datafile integer, OUT compaction_possible boolean, OUT hidden_tupcount bigint, OUT total_tupcount bigint, OUT percent_hidden numeric
Type | normal
Data access | no sql
Volatility | volatile
Owner | dege.zzz
Language | plpgsql
Source code |
| DECLARE
| hinfo_row RECORD;
| threshold float;
| BEGIN
| EXECUTE 'show gp_appendonly_compaction_threshold' INTO threshold;
| FOR hinfo_row IN SELECT gp_segment_id,
| gp_toolkit.__gp_aovisimap_hidden_typed(ao_oid)::gp_toolkit.__gp_aovisimap_hidden_t
| FROM gp_dist_random('gp_id') LOOP
| content := hinfo_row.gp_segment_id;
| datafile := (hinfo_row.__gp_aovisimap_hidden_typed).seg;
| hidden_tupcount := (hinfo_row.__gp_aovisimap_hidden_typed).hidden;
| total_tupcount := (hinfo_row.__gp_aovisimap_hidden_typed).total;
| compaction_possible := false;
| IF total_tupcount > 0 THEN
| percent_hidden := (100 * hidden_tupcount / total_tupcount::numeric)::numeric(5,2);
| ELSE
| percent_hidden := 0::numeric(5,2);
| END IF;
| IF percent_hidden > threshold THEN
| compaction_possible := true;
| END IF;
| RETURN NEXT;
| END LOOP;
| RAISE NOTICE 'gp_appendonly_compaction_threshold = %', threshold;
| RETURN;
| END;
|
Description |
例
postgres=# select * from gp_toolkit.__gp_aovisimap_compaction_info('postgres.ao1'::regclass);
NOTICE: gp_appendonly_compaction_threshold = 10
content | datafile | compaction_possible | hidden_tupcount | total_tupcount | percent_hidden
---------+----------+---------------------+-----------------+----------------+----------------
2 | 1 | f | 21 | 208283 | 0.01
9 | 1 | f | 25 | 208303 | 0.01
16 | 1 | f | 16 | 208352 | 0.01
4 | 1 | f | 23 | 208356 | 0.01
6 | 1 | f | 23 | 208386 | 0.01
3 | 1 | f | 14 | 208333 | 0.01
1 | 1 | f | 14 | 208329 | 0.01
14 | 1 | f | 12 | 208350 | 0.01
15 | 1 | f | 24 | 208346 | 0.01
7 | 1 | f | 22 | 208329 | 0.01
8 | 1 | f | 18 | 208334 | 0.01
0 | 1 | f | 21 | 208314 | 0.01
18 | 1 | f | 16 | 208417 | 0.01
11 | 1 | f | 24 | 208337 | 0.01
17 | 1 | f | 31 | 208380 | 0.01
12 | 1 | f | 12 | 208367 | 0.01
13 | 1 | f | 22 | 208365 | 0.01
5 | 1 | f | 22 | 208367 | 0.01
10 | 1 | f | 18 | 208347 | 0.01
20 | 1 | f | 17 | 208384 | 0.01
27 | 1 | f | 22 | 208348 | 0.01
19 | 1 | f | 31 | 208425 | 0.01
23 | 1 | f | 28 | 208344 | 0.01
26 | 1 | f | 14 | 208339 | 0.01
25 | 1 | f | 21 | 208386 | 0.01
24 | 1 | f | 14 | 208332 | 0.01
21 | 1 | f | 28 | 208360 | 0.01
33 | 1 | f | 18 | 208354 | 0.01
31 | 1 | f | 23 | 208335 | 0.01
22 | 1 | f | 17 | 208309 | 0.01
28 | 1 | f | 21 | 208314 | 0.01
29 | 1 | f | 23 | 208329 | 0.01
30 | 1 | f | 22 | 208342 | 0.01
35 | 1 | f | 18 | 208305 | 0.01
34 | 1 | f | 26 | 208363 | 0.01
32 | 1 | f | 25 | 208396 | 0.01
36 | 1 | f | 23 | 208323 | 0.01
38 | 1 | f | 22 | 208367 | 0.01
37 | 1 | f | 12 | 208334 | 0.01
39 | 1 | f | 12 | 208389 | 0.01
41 | 1 | f | 16 | 208373 | 0.01
42 | 1 | f | 30 | 208376 | 0.01
40 | 1 | f | 31 | 208397 | 0.01
43 | 1 | f | 16 | 208378 | 0.01
46 | 1 | f | 29 | 208371 | 0.01
47 | 1 | f | 16 | 208382 | 0.01
45 | 1 | f | 17 | 208368 | 0.01
44 | 1 | f | 29 | 208381 | 0.01
(48 rows)
解読:
1、content:gp_に対応configuration.contentは、greenplumの各ノードの一意の番号を表します.
2、datafile:このレコードに対応するこのテーブルの1つのデータファイルの番号で、各データファイルは1 GBと仮定します.
3、compaction_possible:このデータファイルが縮小できるかどうか.(gp_appendonly_compaction_thresholdパラメータとpercent_hidden値で判断).
4、hidden_tupcount:更新または削除されたレコードが何件ありますか(表示されません).
5、total_tupcount:更新または削除されたレコードを含むレコードが合計何件ありますか.
6、percent_hidden:記録の割合が表示されません.この割合がgp_より大きい場合appendonly_compaction_thresholdパラメータではvacuumを実行すると、このデータファイルが収縮します.
システム中の膨張率がNを超えるAO表を調べた。
膨張率が千分の2を超えるAO表:
select * from (
select t2.nspname, t1.relname, (gp_toolkit.__gp_aovisimap_compaction_info(t1.oid)).*
from pg_class t1, pg_namespace t2 where t1.relnamespace=t2.oid and relstorage in ('c', 'a')
) t
where t.percent_hidden > 0.2;
結果を返す
nspname | relname | content | datafile | compaction_possible | hidden_tupcount | total_tupcount | percent_hidden
----------+-------------------+---------+----------+---------------------+-----------------+----------------+----------------
postgres | tbl_pos_1_prt_p1 | 1 | 1 | t | 20833382 | 20833382 | 100.00
postgres | tbl_pos_1_prt_p1 | 7 | 1 | t | 20833495 | 20833628 | 100.00
postgres | tbl_pos_1_prt_p1 | 5 | 1 | t | 20833628 | 20833495 | 100.00
postgres | tbl_pos_1_prt_p1 | 3 | 1 | t | 20833469 | 20833469 | 100.00
....
明らかに100%膨張し、以下のように検証された(1つの記録が有効で、15 GBの空間を占有している).
postgres=# select pg_size_pretty(pg_relation_size('tbl_pos_1_prt_p1'));
pg_size_pretty
----------------
15 GB
(1 row)
postgres=# select count(*) from tbl_pos_1_prt_p1;
count
-------
1
(1 row)
vacuumは、膨張率がgp_appendonly_compaction_thresholdパラメータより大きいため、直接収縮することができる.
postgres=# vacuum tbl_pos_1_prt_p1;
VACUUM
postgres=# select count(*) from tbl_pos_1_prt_p1;
count
-------
1
(1 row)
postgres=# select pg_size_pretty(pg_relation_size('tbl_pos_1_prt_p1'));
pg_size_pretty
----------------
40 bytes
(1 row)
VACUM後、40バイトしか占有しません.
収縮膨張AO表
方法は3つあります.
1、VACUMを実行する.(膨張率がgp_appendonly_compaction_thresholdパラメータより大きい場合)は、共有ロックである.
2、VACUM FULLを実行する.(gp_appendonly_compaction_thresholdパラメータの設定にかかわらず、ゴミスペースは回収されます.)DDLロックです.
3、再分布を行う.(gp_appendonly_compaction_thresholdパラメータにかかわらず、ゴミスペースは回収されます.)DDLロックです.
alter table set with (reorganize=true) distributed randomly;
alter table set with (reorganize=true) distributed by (,....)
set distributeはインデックスの膨張空間を回収することができる.set distributeがロードしたロックはDDLロックと似ており、排他ロックです.業務がない時に実行することをお勧めします.業務を塞がないでください.
同時にset distributeは分布条件が変わらない限りノード内で完了し,データの再分布には関与しない.
推奨されるアクション・プロセス:
1
2 set distribute (REORGANIZE=true)
,
リファレンス
http://greenplum.org/docs/510/admin_guide/managing/maintain.html
If the ratio of hidden rows to total rows in a segment file is less than a threshold value (10, by default),
the segment file is not compacted.
The threshold value can be configured with the gp_appendonly_compaction_threshold server configuration parameter.
VACUUM FULL ignores the value of gp_appendonly_compaction_threshold and rewrites the segment file regardless of the ratio.
You can use the __gp_aovisimap_compaction_info() function in the the gp_toolkit schema to investigate
the effectiveness of a VACUUM operation on append-optimized tables.
「Greenplum膨張、ゴミの検出、整理方法-アリ雲HybridDB for PGベストプラクティス」