DELETEのキー列
DELETEを実行すると対象テーブルの全てのプロジェクションの該当データが削除されます。この処理を行うためには、各プロジェクションはDELETEのWHERE句で指定する列を含んでいる必要があります。
含まれていないプロジェクションが存在する場合、DELETEのパフォーマンスが著しく低下する場合があります。
スーパープロジェクションしか存在しないテーブルであれば問題ありませんが、クエリスペシフィックプロジェクション等の特定列のみを持つプロジェクションが存在する場合は注意してください。
なお、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 | スーパープロジェクションを示すフラグ |
[実行例]
dbadmin=> SELECT c.projection_name, c.table_column_name, p.is_super_projection
dbadmin-> FROM projection_columns c, projections p
dbadmin-> WHERE c.table_schema = 'public'
dbadmin-> AND c.table_name = 'lineorder'
dbadmin-> AND c.table_schema = p.projection_schema
dbadmin-> AND c.projection_name = p.projection_name
dbadmin-> ORDER BY c.projection_name, c.column_position;
projection_name | table_column_name | is_super_projection
-----------------------+-------------------+---------------------
lineorder_p1_node0001 | col1 | t
lineorder_p1_node0001 | col2 | t
lineorder_p1_node0001 | col3 | t
lineorder_p1_node0001 | col4 | t
lineorder_p1_node0001 | col5 | t
lineorder_p2_node0001 | col1 | t
lineorder_p2_node0001 | col2 | t
lineorder_p2_node0001 | col3 | t
lineorder_p2_node0001 | col4 | t
lineorder_p2_node0001 | col5 | t
lineorder_p3_node0001 | col1 | f
lineorder_p3_node0001 | col2 | f
lineorder_p3_node0001 | col4 | f
(13 rows)DDL文で確認する方法
EXPORT_OBJECTS関数を使用してDDL文を出力します。
テーブル、プロジェクション(複数)の順に出力されます。
[実行例]
dbadmin=> SELECT export_objects('','public.lineorder','true');
export_objects
----------------------------------------------------------------------
CREATE TABLE public.lineorder
(
col1 int,
col2 int,
col3 numeric(10,0),
col4 char(1),
col5 char(10)
);
CREATE PROJECTION public.lineorder_p1
(
col1,
col2,
col3,
col4,
col5
)
AS
SELECT lineorder.col1,
lineorder.col2,
lineorder.col3,
lineorder.col4,
lineorder.col5
FROM public.lineorder
ORDER BY lineorder.col1,
lineorder.col2,
lineorder.col3,
lineorder.col4,
lineorder.col5
UNSEGMENTED ALL NODES;
CREATE PROJECTION public.lineorder_p2
(
col1,
col2,
col3,
col4,
col5
)
AS
SELECT lineorder.col1,
lineorder.col2,
lineorder.col3,
lineorder.col4,
lineorder.col5
FROM public.lineorder
ORDER BY lineorder.col4,
lineorder.col5,
lineorder.col3,
lineorder.col1,
lineorder.col2
UNSEGMENTED ALL NODES;
CREATE PROJECTION public.lineorder_p3
(
col1,
col2,
col4
)
AS
SELECT lineorder.col1,
lineorder.col2,
lineorder.col4
FROM public.lineorder
ORDER BY lineorder.col2,
lineorder.col4,
lineorder.col1
UNSEGMENTED ALL NODES;
SELECT MARK_DESIGN_KSAFE(0);
(1 row)DELETEヘルスチェック
VerticaではDELETEのヘルスチェックコマンドが用意されています。
上述の方法で各プロジェクションにDELETEのキー列が含まれていることを確認した後、DELETEヘルスチェックコマンドを実行し、実行予定のDELETE処理に問題がないか、最終確認することを推奨します。
問題がある場合は、該当のプロジェクション名が出力されます。
構文
dbadmin=> SELECT evaluate_delete_performance('テーブル名');問題がある場合の実行例
dbadmin=> SELECT evaluate_delete_performance('public.lineorder');
evaluate_delete_performance
----------------------------------------------------------------------
The following projection exhibits delete performance concerns:
"public"."testp_node0001"
See v_catalog.projection_delete_concerns for more details.
(1 row)問題がない場合の実行例
dbadmin=> SELECT evaluate_delete_performance('public.lineorder');
evaluate_delete_performance
---------------------------------------------------
No projection delete performance concerns found.
(1 row)参考情報
・DELETEの注意点(1)
https://www.ashisuto.co.jp/cm/analytics-database/delete-notice-1.html
・DELETEの注意点(2)
https://www.ashisuto.co.jp/cm/analytics-database/delete-notice-2.html
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 本記事を公開
