🕳️

SnowSQLでセッションパラメータを設定する時は気をつけよう

2022/08/03に公開

前置き

こんにちは。株式会社GENDAのこみぃです。

みなさん、SnowSQL使ってますか?
SnowSight上でGUIでの操作もいいですが、構築作業などしていくとなったらやはりCLIで作業したいですよね。
SnowSQLはCLIでsnowflakeを扱うツールです。

今日はそのSnowSQLを使って作業をしていてハマったことがあったのでそのお話をします。

ことの始まり

以前に料金体系とそれに関連する仕様に関してハマったことを記事にしたことがありました。
https://zenn.dev/kommy339/articles/6e7f3ecedfb7c5

この話について、ありがたいことに偉い人からコメントを頂きました。

また、参考までにですが、ABORT_DETACHED_QUERYをtrueにすることを検討頂いても良いかもしれません。
https://docs.snowflake.com/ja/sql-reference/parameters.html#abort-detached-query

BIツールからのアクセスにおいて、利用者がSQLを連打するのが避けにくいです。
そんな時に連打されたクエリのうち不要なものを切ってくれるということで、これは非常に良さそうなパラメータです。

さっそくABORT_DETACHED_QUERYを試してみるが、、、

教わったら即試しましょう。
そこでSnowSQLを使って試してみました。

まずは今の設定を確認しました。

show_abort_detached_query
>show PARAMETERS like '%ABORT_DETACHED_QUERY%';
+----------------------+-------+---------+---------+------------------------------------------------------------------------------------------------------+---------+
| key                  | value | default | level   | description                                                                                          | type    |
|----------------------+-------+---------+---------+------------------------------------------------------------------------------------------------------+---------|
| ABORT_DETACHED_QUERY | false | false   | SESSION | If true, Snowflake will automatically abort queries when it detects that the client has disappeared. | BOOLEAN |
+----------------------+-------+---------+---------+------------------------------------------------------------------------------------------------------+---------+
1 Row(s) produced. Time Elapsed: 0.133s

デフォルトはFALSEになってますね。
アカウント単位でTRUEにしていいかなと思ったので最終的にはそうする予定ですが、ひとまず自分のアカウントのデフォルトを変えてみようと思い、以下のようなコマンドを実行。

set_abort_detached_query
>ALTER USER {私のユーザー名} SET ABORT_DETACHED_QUERY=TRUE;
+----------------------------------+
| status                           |
|----------------------------------|
| Statement executed successfully. |
+----------------------------------+
1 Row(s) produced. Time Elapsed: 0.523s

無事に設定できたような表示が出たので、一回切断して改めてログインして確認

show_abort_detached_query_again
$ snowsql
* SnowSQL * v1.2.22
Type SQL statements or !help

>show PARAMETERS like '%ABORT_DETACHED_QUERY%';
+----------------------+-------+---------+---------+------------------------------------------------------------------------------------------------------+---------+
| key                  | value | default | level   | description                                                                                          | type    |
|----------------------+-------+---------+---------+------------------------------------------------------------------------------------------------------+---------|
| ABORT_DETACHED_QUERY | false | false   | SESSION | If true, Snowflake will automatically abort queries when it detects that the client has disappeared. | BOOLEAN |
+----------------------+-------+---------+---------+------------------------------------------------------------------------------------------------------+---------+
1 Row(s) produced. Time Elapsed: 0.135s

あ、あれ、、、変わってない?

問い合わせてみる

その後色々調べてみたのですが、わからなかったので問い合わせしてみました。サポートは使わないとね。

問い合わせをしてわかったのは以下のような感じ。

  • SnowSQLを使ってパラメータを設定することは出来る
  • SnowSQLを使う場合セッションパラメータのいくつかは別でデフォルト値を書き換えていても無視される
    • デフォルト値自体はは書き換わっている
    • あくまでSnowSQLを使う場合のみ、明示的に指定しないと書き換わらない
    • 以下のように明示的に指定して接続したら反映できる
      • snowsql --abort-detached-query
  • SnowSQLはあくまでCLIでの利用を可能にするためのツール
    • SnowSightでのGUIでの操作と違う仕様がある

つまりどういうことかというと

  • 今回の操作でデフォルト値自体は書き換わっている
  • SnowSQLを使う場合は特殊な仕様があり、設定したデフォルト値が反映されないことがある

SnowSQLでセッションパラメータのデフォルト値を設定する方法

この見出しにするとやや語弊がありますが、SnowSQLでもパラメータのデフォルト値を設定することは可能です。

例えばアカウント単位でABORT_DETACHED_QUERYを設定したかったら、こんな感じにすればOK

set_abort_detached_query_to_account
ALTER ACCOUNT SET ABORT_DETACHED_QUERY = TRUE;

別のユーザー名を指定して検索すると、valueの部分がちゃんと書き換わり、levelもACCOUNTで指定されていることがわかります。

show_parameter_for_another_user
>show PARAMETERS like '%ABORT_DETACHED_QUERY%' for user {別のユーザー名};
+----------------------+-------+---------+---------+------------------------------------------------------------------------------------------------------+---------+
| key                  | value | default | level   | description                                                                                          | type    |
|----------------------+-------+---------+---------+------------------------------------------------------------------------------------------------------+---------|
| ABORT_DETACHED_QUERY | true  | false   | ACCOUNT | If true, Snowflake will automatically abort queries when it detects that the client has disappeared. | BOOLEAN |
+----------------------+-------+---------+---------+------------------------------------------------------------------------------------------------------+---------+

今回の場合は先に自分のユーザーに対してパラメータを指定してテストしてしまっていて、それをさらに自分のユーザーでSnowSQLにアクセスして確かめていたのでかなり混乱したというお話でした。

本日のまとめ

本日のまとめは以下になります。

  • SnowSQLでの操作でもパラメータは設定できている
  • SnowSQLでの操作でパラメータを変更する場合はSnowSQLの仕様に注意しよう

ね、簡単でしょ?
いや、今回はそんなに簡単じゃないか。。。。

なお、ABORT_DETACHED_QUERY自体がどうだったかは、後日また別でお話しようと思います。

結びの言葉

今回のような件はまだまだSnowflakeが発展途上のサービスなのだなというお話になるような気がしています。
せっかく新興のサービスを使っているのですから、そういう過程も楽しんでまいりましょう。

個人的にはGUIとCLIで差があるのは変だと思う派なので修正されてほしいと思いつつ、同じことでみなさまが困らないように記事にしていくのを頑張ろうかなと思います。

もっと詳しいお話が知りたいという方は、私が知っている範囲ならお答えできますのでTwitterあたりでお気軽にお声がけください。
@kommy_jp

なお、株式会社GENDAでは、一緒に働くデータ関連の人材を絶賛募集中です。
興味がある方は是非お声がけください。
https://genda.jp/

本日はこのあたりで。
それじゃあ、バイバイ!

Discussion