DELETEのキー列

DELETEを実行すると対象テーブルの全てのプロジェクションの該当データが削除されます。この処理を行うためには、各プロジェクションはDELETEのWHERE句で指定する列を含んでいる必要があります。
含まれていないプロジェクションが存在する場合、DELETEのパフォーマンスが著しく低下する場合があります。

delete-notice-3

スーパープロジェクションしか存在しないテーブルであれば問題ありませんが、クエリスペシフィックプロジェクション等の特定列のみを持つプロジェクションが存在する場合は注意してください。

なお、Database Designerを使用してプロジェクションを作成する場合は、よく使うSQLと一緒に使用予定のDELETE文を読み込ませることで、そのDELETEで使用するキーも含んだプロジェクションが作成されるため、このパフォーマンスの問題を回避できます。

プロジェクションに含まれる列を確認する方法

DELETEのキー列がプロジェクションに含まれているか確認する方法を、2つご紹介します。
実行例は、スーパープロジェクションとクエリスペシフィック・プロジェクションの2つのプロジェクションが用意されている状態で実行したものです。

システムテーブルで確認する方法

PROJECTION_COLUMNSおよびPROJECTIONSシステムテーブルで、各プロジェクションの列を確認します。

[PROJECTION_COLUMNS]
列名内容
PROJECTION_NAMEプロジェクション名
COLUMN_POSITIONプロジェクション作成時の列の順序
TABLE_SCHEMAスキーマ名
TABLE_NAMEテーブル名
TABLE_COLUMN_NAMEカラム名

[PROJECTIONS]
列名内容
PROJECTION_SCHEMAスキーマ名
PROJECTION_NAMEプロジェクション名
IS_SUPER_PROJECTIONスーパープロジェクションを示すフラグ
「t」の場合、スーパープロジェクション
「f」の場合、非スーパープロジェクション

[実行例]


DDL文で確認する方法

EXPORT_OBJECTS関数を使用してDDL文を出力します。
テーブル、プロジェクション(複数)の順に出力されます。

[実行例]


DELETEヘルスチェック

VerticaではDELETEのヘルスチェックコマンドが用意されています。
上述の方法で各プロジェクションにDELETEのキー列が含まれていることを確認した後、DELETEヘルスチェックコマンドを実行し、実行予定のDELETE処理に問題がないか、最終確認することを推奨します。
問題がある場合は、該当のプロジェクション名が出力されます。

構文


問題がある場合の実行例


問題がない場合の実行例


参考情報

・DELETEの注意点(1)
http://vertica-tech.ashisuto.co.jp/delete-notice-1/

・DELETEの注意点(2)
http://vertica-tech.ashisuto.co.jp/delete-notice-2/

EVALUATE_DELETE_PERFORMANCE
https://www.vertica.com/docs/9.2.x/HTML/Content/Authoring/SQLReferenceManual/Functions/VerticaFunctions/EVALUATE_DELETE_PERFORMANCE.htm

検証バージョンについて

この記事の内容はVertica 9.2で確認しています。

更新履歴

2019/04/12 検証バージョンを9.2に変更
2015/08/18 本記事を公開