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ベストプラクティス」