目次
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 | スーパープロジェクションを示すフラグ 「t」の場合、スーパープロジェクション 「f」の場合、非スーパープロジェクション |
[実行例]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
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文を出力します。テーブル、プロジェクション(複数)の順に出力されます。
[実行例]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
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処理に問題がないか、最終確認することを推奨します。
問題がある場合は、該当のプロジェクション名が出力されます。
構文
1 |
dbadmin=> SELECT evaluate_delete_performance('テーブル名'); |
問題がある場合の実行例
1 2 3 4 5 6 7 8 |
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) |
問題がない場合の実行例
1 2 3 4 5 6 |
dbadmin=> SELECT evaluate_delete_performance('public.lineorder'); evaluate_delete_performance --------------------------------------------------- No projection delete performance concerns found. (1 row) |
参考情報
・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 本記事を公開