myVertica  

デリートベクターの対処方法

デリートベクターを手動で削除するか、または自動的に削除されないためにトラブルシューティングをする場合、このチェックリストが役立ちます。

ステップ タスク 結果
1 プロジェクションでデリートベクターが多すぎるかどうか(100以上を目安)を確認します。 =>SELECT node_name, schema_name, projection_name, COUNT(*) num_dv, SUM(deleted_row_count) del_cnt, SUM(used_bytes) ubytes, MIN(start_epoch) min_epoch, MAX(start_epoch) max_epoch FROM delete_vectors GROUP BY 1,2,3 ORDER BY 4 DESC; num_dvで確認できるデリートベクターの数が多すぎる(通常、100以上が目安)場合、Step 2 へ。
2 AHMやLGEが進んでいるかどうかを確認します。 =>SELECT current_epoch,ahm_epoch,last_good_epoch FROM system; AHMやLGEが進んでいる場合、Step 3 へ。

AHMやLGEが進んでいない場合、Epoch Management checklist チェックリストを参照してください。
3 Step 1 で確認したエポックの番号が、Step 2 で確認したAHMよりも古いかどうかを確認します。 Step 1 のクエリの結果により、デリートされた行がAHMより新しいエポックの場合、Step 4 へ。
4 下記のコマンドでAHMを進めます。 =>SELECT make_ahm_now(); 次のいずれかを実行します。
  • パラメーターの値に基づき、mergeoutがデリートベクターを物理削除するのを待つ。
  • Step 5 に進み、手動でただちに削除する。
  • mergeoutが定期的に実行される際に、デリートベクターがを物理削除されるのを待っている場合、このチェックリストは完了です。

    mergeoutでの削除を手動で実行開始する場合、Step 5 へ。
    5 マークされたデリートベクターのパーセンテージがPurgeMergeoutPercentを満たすかどうかを確認します。この構成パラメータにより、、デリートベクターーがmergeout処理によって自動でpurgeされるタイミングが指可可能です。
  • PurgeMergeoutPercentを下記コマンドで確認します。 =>SELECT get_config_parameter('PurgeMergeoutPercent');
  • マークされたデリートベクターのパーセンテージを下記コマンドで確認します。 =>SELECT schema_name, projection_name, ((deleted_row_count/total_row_count)*100)::int per_deleted, total_row_count, deleted_row_count FROM storage_containers WHERE deleted_row_count > 0 ORDER BY 3 DESC;
  • デリートベクターのパーセンテージがPurgeMergeoutPercentより大きく、ROSサイズが大きすぎない場合、下記2つの選択肢があります。
  • mergeoutがデリートベクターを物理削除するまで待つ。
  • purgeを強制実行するために、Step 5a へ。

  • デリートベクターのパーセンテージがPurgeMergeoutPercentより大きくないが、デリートベクターが大量に存在する場合、Step 5b へ。

    デリートベクターのパーセンテージがテーブルの50%以上の行数占める場合、次のうちのいずれかを実行します。
  • purgeの強制実行 (Step 5a)
  • 削除されていないデータのみを含むテーブルを新規作成 ( Step 5c)
  • a. 次のうちいずれかを実行することにより、purgeを強制します。
  • AHMより古いエポックを持つ削除行を物理削除するために、PURGE_TABLE、もしくは、PURGE_PROJECTIONを実行する。
  • テーブルがパーティション化されていて、削除された行が特定のパーティションに集中している場合、PURGE_PARTITIONを実行する。
  • このチェックリストは完了です。
    b. デリートベクターをマージして、データの書き換えなしに、ディスク上のファイル数を減らします。 =>SELECT DO_TM_TASK('dvmergeout'); このチェックリストは完了です。
    c. 削除されていないデータのみを含むテーブルを新規作成します。まずはじめに、元テーブルAと同じ定義情報の新しいテーブルBをCREATE TABLEコマンドを使ってプロジェクションを含む形で作成する必要があります。続いて、次のコマンドを実行します。 =>INSERT into B SELECT * from A; DROP TABLE A; ALTER TABLE B RENAME to A; このチェックリストは完了です。

    関連詳細情報

    Vertica Knowledge BaseBest Practices for Deleting DataDeletes in Vertica: The FAQS にて、詳細情報が確認できます。