AnalyticDB for PostgreSQLは、インテリジェントなデータ膨張診断機能を提供します。 この機能は、すべてのデータベーステーブルの診断を定期的に自動的に実行し、診断情報テーブルを生成します。 診断情報テーブルを使用して、テーブルのデータ膨張ステータスを確認し、VACUUMやVACUUM FULLステートメントなどの最適化の提案を取得できます。
使用上の注意
インテリジェントデータ膨張診断機能は、次のマイナーバージョン要件を満たすエラスティックストレージモードのAnalyticDB for PostgreSQLインスタンスでのみサポートされています。
AnalyticDB for PostgreSQL V6.0: V6.3.10.0以降。
AnalyticDB for PostgreSQL V7.0: V7.0.4.0以降。
マイナーバージョンの表示および更新方法については、「インスタンスのマイナーバージョンの表示」および「インスタンスのマイナーバージョンの更新」をご参照ください。
5つのシステムデータベース (postgres、template0、template1、adbpgadmin、およびaurora) を除いて、インテリジェントデータ膨張診断機能がすべてのデータベースに実装されています。 データが膨張していると診断されるように、5つのシステムデータベースにデータを保存しないことをお勧めします。
インテリジェントデータ膨張診断機能は、一時テーブルと未ログテーブルを除くすべてのデータベーステーブルをスキャンします。 デフォルトでは、サイズが1 GB未満のテーブルは、速度と有効性のバランスをとるためにスキャンされません。 データ量のしきい値を変更する方法については、このトピックの「データ量のしきい値の指定」をご参照ください。
インテリジェントなデータ膨張診断機能は、各時間の初めにすべてのユーザーデータベースで自動的に診断を実行します。 たとえば、インテリジェントデータ膨張診断機能が17:00:00に診断を実行した後、機能は18:00:00に次の診断を実行します。
原因データ膨満
データ膨張は、テーブル内の未使用スペースとデッドタプルスペースの尺度です。 AnalyticDB for PostgreSQLは、マルチバージョン同時実行制御 (MVCC) を使用して同時トランザクションを管理します。 基になるテーブルのデータは32 KBのページに分割されます。 各ページには、ヘッダー、アイテムポインター配列、未使用スペース、およびタプルが含まれます。
INSERTステートメントを実行すると、ページの未使用領域から新しいタプルが割り当てられます。 現在のページの未使用スペースが不十分である場合、新しいページが、書き込まれたデータを記憶するために割り当てられる。
DELETE文を実行しても, ページからデータは削除されません。 削除するデータは、デッドタプルとしてマークされます。 死んだタプルはまだスペースを占有し、データの膨張を引き起こす可能性があります。
UPDATEステートメントを実行すると、MVCCポリシーはデータを直接更新しません。 元のタプルはデッドタプルとしてマークされ、新しいタプルがデータを更新するために挿入されます。 この場合、UPDATE操作はデータ膨張を引き起こす可能性もあります。
データの膨張を確認する
インテリジェントデータ拡張診断機能によって生成された診断情報は、adbpg_toolkit.diag_bloat_tablesテーブルに格納されます。
diag_bloat_tablesテーブルの診断情報は、ORDER by bloat_coeff desc, real_size DESC句を使用してソートされます。 より大きな膨張係数を有するテーブルは、より早い位置に配置される。 2つのテーブルが同じ膨張係数を有する場合、より多くのデータを有するテーブルは、より早い位置に配置される。診断情報テーブルは、PostgreSQLの統計収集プロセスによって収集された統計に基づいて生成されます。 万が一、PostgreSQLサーバーが応答に失敗した場合、統計コレクタープロセスは統計をリセットします。 診断情報が不合理な場合は、ANALYZEステートメントを実行して統計を収集できます。 詳細については、「ANALYZEステートメントを使用して統計を収集する」をご参照ください。
次のいずれかの方法を使用して、診断情報を表示できます。
AnalyticDB for PostgreSQLコンソールで診断情報を表示します。 詳細については、「データ膨張、データスキュー、およびインデックス統計」をご参照ください。
次のSQL文を実行して診断情報を照会します。
SELECT * FROM adbpg_toolkit.diag_bloat_tables;次の表に、
diag_bloat_tablesテーブルに含まれるフィールドを示します。項目
データ型
説明
schema_name
name (システム識別子を格納するための63バイトタイプ)
テーブルが属するスキーマ名
table_name
name
テーブルの名前。
storage_type
text
テーブルのストレージタイプ。 例: ヒープテーブルまたは追加最適化 (AO) テーブル。
expect_size
bigint
テーブルの予想サイズ。 単位はバイトです。
real_size
bigint
テーブルの実際のサイズ。 単位はバイトです。
bloat_size
bigint
テーブルの肥大化サイズ。 単位はバイトです。
bloat_coeff
bigint
テーブルの膨満係数。 単位: % 。 有効値: 0~100。
suggest_action
text
テーブル上の提案されたアクション。 有効な値:
空 (アクションなし)
真空
真空フル
last_vacuum
タイムゾーンのタイムスタンプ
テーブルが最後に掃除機をかけられた時間。 VACUUM FULL操作は含まれません。
diagnoste_time
タイムゾーンのタイムスタンプ
診断情報が生成された時刻。
フィルター条件を指定して、スキーマまたはテーブルのデータ膨張を確認できます。
特定のスキーマ内のすべてのテーブルでデータ膨張を確認します。
SELECT * FROM adbpg_toolkit.diag_bloat_tables WHERE schema_name = '<Schema name>';特定のテーブルのデータ膨張を確認します。
SELECT * FROM adbpg_toolkit.diag_bloat_tables WHERE table_name = '<Table name>';
手動で開始データbloat診断
デフォルトでは、インテリジェントデータ膨張診断は各時間の初めに開始されます。 VACUUMまたはVACUUM FULLステートメントの効果をすぐに確認する場合は、手動でデータ膨張診断を開始できます。 次のステートメントを実行して、データ膨張診断を手動で開始します。
SELECT adbpg_toolkit.diagnose_bloat_tables();データ量のしきい値の指定
デフォルトでは、インテリジェントデータ拡張診断機能は、サイズが1 GB未満のテーブルを除外します。 データ量のしきい値を変更する場合は、次のステートメントを実行できます。
ALTER DATABASE <Database name> SET adb_diagnose_table_threshold_size to <Table size in bytes>;たとえば、サイズが500 MBを超えるテーブルに対して診断を実行するには、次のステートメントを実行します。
ALTER DATABASE diagnose SET adb_diagnose_table_threshold_size to 536870912;データの肥大化を排除
INSERT、DELETE、およびUPDATE操作がテーブルに対して実行されると、多数のデッドタプルが生成されます。 この場合、未使用スペースが削減され、より多くのページがデータを格納するために割り当てられる。 また, ページがスキャンする場合, 多くの死のタプルもスキャンダルも数えられる. これにより, I / O 時間を増やす. データ膨張は次の副作用を引き起こします。
大きなテーブルストレージスペースが割り当てられ、ストレージスペースの無駄になります。
スキャンI/Oオーバーヘッドが増加し、クエリのパフォーマンスが低下します。
VACUUMまたはVACUUM FULLステートメントを実行して、データの膨張を解消できます。
VACUUMステートメントを実行して無効なタプルを削除し、新しいタプルに使用できる未使用領域を増やします。
この方法では、以下のようなメリットとデメリットがあります。
利点: VACUUM FULLステートメントと比較して、VACUUMステートメントはテーブルロックによる制限が少なくなります。 VACUUM FULLは, ACCESS EXCLUSIVE ロックモードを使用し, テーブルの他の種類の操作をブロックする. たとえば、テーブルに対してVACUUM FULLステートメントを実行すると、SELECTステートメントはブロックされます。 VACUUM FULLステートメントが完了する前にテーブルを使用することはできません。
短所: VACUUMステートメントでは、テーブルのストレージスペースをページ間で整理できません。 ディスク上のテーブルサイズは縮小できません。
VACUUM FULLステートメントを実行してデッドタプルを削除し、新しいタプルで使用できる未使用領域を増やし、ページ間でテーブルのストレージ領域を整理します。
この方法では、以下のようなメリットとデメリットがあります。
利点: テーブルデータはよりコンパクトになるために整理されます。 ディスク上のテーブルサイズを小さくすることができます。
短所: VACUUM FULLステートメントはACCESS EXCLUSIVEロックモードを使用し、テーブルに対する他のすべての種類の操作をブロックします。 VACUUM FULLステートメントがページを整理すると、追加のストレージスペースが使用されて整理されたデータが格納されます。