8. 8
DELETE FROM テー
ブル WHERE A=1;
A B C
B CA CA
B A C
A 1 pen
B 2 apple
A C
1 pen
2 apple
X X
データファイル
位置情報 エポック
1 1234
デリートベクター
位置情報 エポック
1 1234
デリートベクターデータファイル
テーブル
プロジェクション
DELETE処理の流れ
9. 9
SELECT * FROM
テーブル;
A B C
B CA CA
B A C
A 1 pen
B 2 apple
A C
1 pen
2 apple
X X
データファイル
位置情報 エポック
1 1234
デリートベクター
位置情報 エポック
1 1234
デリートベクターデータファイル
テーブル
プロジェクション
B A C
B 2 apple
DELETEされたデータを持つテーブルに対するSELECT処理の流れ
24. デリートベクターのモニタリング
DELETE_VECTORSシステムテーブル
- クエリ例:プロジェクションごとのデリートベクターの行数一覧
STORAGE_CONTAINERSシステムテーブル
- クエリ例:プロジェクションの全行数に対してデリートベクターの行数が5%を超えるプロジェク
ション名一覧
24
SELECT distinct schema_name, projection_name, deleted_row_count,
total_row_count
FROM storage_containers
WHERE deleted_row_count > total_row_count * .05::FLOAT
ORDER BY deleted_row_count DESC;
SELECT schema_name, projection_name, sum(deleted_row_count)
FROM delete_vectors
GROUP BY 1, 2
ORDER BY 3 DESC;
25. デリートベクターとエポックの関係
エポック名 説明(要チェック)
Current Epoch(CE) Current epoch(現在のエポック)は、COMMIT操作後の最後のエポック(LE)になるオープン状態のエ
ポックです。 COMMIT時のcurrent_epochは、そのDMLのエポックです。
Latest Epoch(LE) Latest epoch(最新のエポック)は、一番最後に閉じたエポックです。 COMMIT操作後のcurrent epoch(
現在のエポック)は、latest epoch(最新のエポック)になります。
Last Good Epoch(LGE) すべてのノードで最小のチェックポイントエポックは、last good epoch(最後の正常なエポック)とし
て知られています。 Last good epochとは、手動リカバリで回復できる最新のエポックを指します。
Ancient History Mark(AHM) Ancient history markは、それより前の履歴データを物理ストレージからpurgeすることができるエポック
です。 AHMの前に履歴クエリを実行することはできません。
25
31. Clickstreamテーブルの年月カラムに対し
て、DROP_PARTITIONを実行する際の実行
クエリ例
Clickstreamテーブルのテーブル設計例
=> select
DROP_PARTITION(‘Clickstream’,’201
6’);
CREATE TABLE clickstream (
tdate DATE NOT NULL,
user VARCHAR(20),
URL VARCHAR(100),
…
)
PARTITION BY EXTRACT
(year FROM tdate);
2016年のデータを全て削除。Rollback不可
だが、デリートベクターは生成されず、
ファイルがただちに物理削除されるため、
システムパフォーマンスに悪影響を与え
ることはない。
パーティションキーの指定に関数も使
用可能。ただし、パーティションキー
ごとにROSコンテナが生成されるため、
ROSコンテナのノード・プロジェク
ション毎の上限値1024を超えないよう
に指定するカラムを決める必要あり。
DELETEに最適化するためのテーブル設計例
32. tテーブルに対するDELETEの実行クエリ例 tテーブルのプロジェクション設計例
32
=> DELETE from t WHERE a = 1;
=> DELETE from t WHERE b = 1;
CREATE TABLE t (a INTEGER, b
INTEGER, c INTEGER);
CREATE PROJECTION p1 (a, b, c) AS
SELECT * FROM t ORDER BY a;
CREATE PROJECTION p2 (a, b) AS
SELECT a, b FROM t ORDER BY b, a;
たとえば、WHERE句にカラムaとカラムb
を指定するケースがあるとする。
すべての関連プロジェクションに、カラ
ムaとカラムbを含むように設計すること
により最適化される。
DELETEに最適化するためのプロジェクション設計例
33. DELETEに最適化するためのプロジェクション設計例
DELETEに最適なプロジェクションのソート順
1. 下記のように、たとえば、time_keyのようなよくDELETE文のWHERE句に指定されるカラムがある場
合、すべての関連プロジェクションのORDER BY句にtime_keyを入れるようにする。
2. 各プロジェクションのORDER BY句に指定したカラムの組み合わせに対する行が一意、あるいは、小
さい行セットとなるように指定する。
システム構築時に実行されうるDELETE文が予測できない、あるいは、システム構築後に
DELETE文の発行のされかたが変わってしまったような場合、EVALUATE_DELETE_PERFORMANCE
関数を実行することにより、DELETEに最適化すべきプロジェクションを確認可能
33
=> DELETE from t where time_key < '1-1-2007';
=> select evaluate_delete_performance();
evaluate_delete_performance
---------------------------------------------------------------------------
The following projection exhibits delete performance concerns:
"public"."one_sort"
See v_catalog.projection_delete_concerns for more details.
(1 row)
37. Replay Delete遅延の対応策
Replay Deleteが遅延しているプロジェクションを特定し、該当するプロジェクションのソー
ト順(ORDER BY句)の最後にカーディナリティの高い列を追加する
下記コマンドで、replay deleteのパフォーマンスも評価可能
37
=> select evaluate_delete_performance();
evaluate_delete_performance
---------------------------------------------------------------------------
The following projection exhibits delete performance concerns:
"public"."one_sort"
See v_catalog.projection_delete_concerns for more details.
(1 row)
38. 関連ページ
Best Practices for Deleting Data (英語)
- 上記記事の日本語版はこちら
Deletes in Vertica: The FAQs (英語)
- 上記記事の日本語版はこちら
Understanding Vertica Epochs (英語)
- 上記記事の日本語版はこちら
Tuple Mover Best Practices (英語)
- 上記記事の日本語版はこちら
Best Practices for DELETE and UPDATE (英語)
38