Amazon Redshift クエリ履歴に任意のコメントを追加する方法

はじめに

Redshiftで呼び出されたクエリのトレースしていると、常に様々なクエリが同時に実行されていますので、このクエリが一体どこで呼び出されたものか特定することは容易でありません。今回はクエリ履歴にコメントを追加させるTipsをご紹介します。更に追加コメントをクエリ対象にすることで、スロークエリーの特定やクエリの実行時間の推移を把握できるようになります。

標準SQLのコメント

標準SQLのコメントの構文は、以下の2種類あります。

コメントは二重ハイフンで始まる任意の文字の並びで、行の終わりまで続きます。たとえば以下のようになります。

-- これは標準SQLのコメントです

もう一つは、C言語形式のブロックコメントによる方法です。

/* これは標準SQLのコメントです */

ブロックコメントは更にネストができるので、既存のブロックコメントを含む可能性のある大きなコードのブロックをコメントアウトすることができます。

/* ネスト付き
 * 複数行コメント /* ネストされたブロックコメント */
 */

この2種類のコメント構文を使い分けることで、コメントを追加させる/させないことが可能です。

クエリ履歴にコメントを追加する/しない方法

二重ハイフンで始まるコメントを付けた場合

cmdb=> -- aaa
cmdb=> select * from aaa;
 id | name
----+------
  1 | a1
  2 | a2
  3 | a3
(3 rows)

二重ハイフンで始まるコメントでは、コメントは追加されません。

cmdb=> select query, trim(querytxt) as sqlquery from stl_query order by query desc limit 1;
  query  |                               sqlquery
---------+-----------------------------------------------------------------------
 1605553 | select * from aaa;
(1 rows)

ブロックコメントを付けた場合

cmdb=> /* bbb */
cmdb-> select * from bbb;
 sub_id | sub_name
--------+----------
     11 | b11
     12 | b12
     13 | b13
(3 rows)

ブロックコメントでは、コメントが追加されました。改行は削除されて、一行になります。

cmdb=> select query, trim(querytxt) as sqlquery from stl_query order by query desc limit 1;
  query  |                               sqlquery
---------+-----------------------------------------------------------------------
 1605554 | /* bbb */ select * from bbb;
(1 rows)

ブロックコメントを付けた場合(JavaDoc風のコメント)

JavaDoc風のコメント(/** */)も試してみました。

cmdb=> /** ccc */
cmdb-> select * from ccc;
 sub_id | sub_name
--------+----------
     21 | c21
     22 | c22
     23 | c23
(3 rows)

全く問題なくコメントが追加されました。/* *//** */を使い分けたい人には朗報です。

cmdb=> select query, trim(querytxt) as sqlquery from stl_query order by query desc limit 1;
  query  |                               sqlquery
---------+-----------------------------------------------------------------------
 1605555 | /** ccc */ select * from ccc;
(1 rows)

ブロックコメントを付けた場合(連続3つ)

cmdb=> /* comment 1 */
cmdb-> /* comment 2 */
cmdb-> /* comment 3 */
cmdb-> select * from ddd;
 sub_id | sub_name
--------+----------
     31 | d31
     32 | d32
     33 | d33
(3 rows)

改行はありませんが、コメントは追加されました。

cmdb=> select query, trim(querytxt) as sqlquery from stl_query order by query desc limit 1;
  query  |                               sqlquery
---------+-----------------------------------------------------------------------
 1605556 | /* comment 1 */ /* comment 2 */ /* comment 3 */ select * from ddd;
(1 rows)

ブロックコメントを付けた場合(ブロックコメントのネスト)

cmdb=> /* ネスト付き
cmdb*>  * 複数行コメント /* ネストされたブロックコメント */
cmdb*>  */
cmdb-> select * from eee;
 sub_id | sub_name
--------+----------
     41 | d41
     42 | d42
     43 | d43
(3 rows)

改行はありませんが、コメントは追加されました。

cmdb=> select query, trim(querytxt) as sqlquery from stl_query order by query desc limit 1;
  query  |                               sqlquery
---------+-----------------------------------------------------------------------
 1605624 | /* ネスト付き * 複数行コメント /* ネストされたブロックコメント */ */ select * from eee;
(1 rows)

検証結果

  • 二重ハイフンで始まるコメントは、クエリ履歴に残らない
  • ブロックコメントは、何れの場合もクエリ履歴に残る。但し、改行は残らない。

つまり、コード上のコメントにしたい場合は「二重ハイフンで始まるコメント」を用いる。一方、Redshiftのクエリ履歴にコメントを追加したい場合は、ブロックコメントを用いる。

クエリ履歴にコメントを追加するメリットやユースケース

例えば、クエリ履歴に以下の情報を埋め込むと仮定します。

  • バッチ開始日時 … 呼び出されたバッチの一連のクエリを特定できる
  • バッチID … バッチの種類を特定できる
  • ステップID … バッチの中の何番目かを特定できる

そして、これらの情報を組み合わせると、以下のような稼働状況を把握できます。

  • 過去のバッチIDのステップIDのクエリの処理時間の平均を把握する
  • 過去のバッチIDのステップIDのクエリの処理時間の標準偏差を利用してアラート通知する
  • バッチIDのステップIDのクエリーの完了予定時間を超えたらアラート出力する

最後に

クエリ履歴にコメントを追加する方法と、メリットやユースケースについてイメージして頂けたと思います。今回はクエリ履歴をstl_queryに対してクエリ実行しましたが、RedshiftコンソールのQueriesビューのフィルタに文字列指定できるので、簡単にお試しできます。ちょっとした情報を埋め込むだけで、可視化やダッシュボードの作成が容易になると思いますので、クエリーをトレースしたいときはブロックコメントの挿入を検討してください。