デリートベクター
VerticaのDELETEは論理削除を行います。DELETEが実行されると、実際にはデータは削除されず、デリートベクターと呼ばれるDELETE情報を管理する領域にDELETE行の情報が書き込まれます。
※論理削除とは、データを残したまま該当行を「Deleted」としてマークする動作です。
DELETEの注意点 (1)
デリートベクターにDELETE情報が格納されている状態で、該当のテーブルにSELECTを実行すると、SELECT結果セットとデリートベクターの情報がマージされ、DELETE済みのデータを除いた正しい結果が返されます。この処理は、通常のSELECTに比べてオーバーヘッドがあるため、パフォーマンスに影響が出る場合があります。
DELETEで論理削除された行はMergeout(デフォルトでは10分間隔でチェック)のタイミングで物理的に削除されます。この物理削除をPurgeと言います。
Purge完了後はデータが物理削除されたことでデリートベクターによる管理が必要なくなるため、SELECT処理は通常のパフォーマンスで処理されるようになります。
日中帯等ユーザアクセスのある時間帯に大量のDELETEを実施すると、Purgeが行われるまではパフォーマンスへの影響が懸念されるため、大量のDELETE処理は夜間帯等アクセスの少ない時間に実施することをお薦めします。
なお、Purge処理は以下のSELECT文を実行して手動で実行することもできます。
構文
1 2 |
dbadmin=> SELECT MAKE_AHM_NOW(); dbadmin=> SELECT PURGE_TABLE('テーブル名'); |
※DELETE件数によっては、Purgeがすぐに終わらない場合もあります。
実行例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
dbadmin=> SELECT MAKE_AHM_NOW(); MAKE_AHM_NOW ------------------------------ AHM set (New AHM Epoch: 781) (1 row) dbadmin=> dbadmin=> dbadmin=> SELECT PURGE_TABLE('public.tbl1'); PURGE_TABLE ------------------------------------------------------------------------------------------------ Task: purge operation (Table: public.tbl1) (Projection: public.tbl1_DBD_11_rep_dbd1_node0001) (1 row) |
参考情報
・Write Once アーキテクチャhttp://vertica-tech.ashisuto.co.jp/write-once/
・DELETEの注意点(2)
http://vertica-tech.ashisuto.co.jp/delete-notice-2/
・DELETEの注意点(3)
http://vertica-tech.ashisuto.co.jp/delete-notice-3/