IntelliJ IDEA の Database Tool Windowはいいぞ

IntelliJ IDEA の試用に手を上げる人が少なかったら、コードほとんど書かない老人けど参加するよーと、言ってたら、本当に試用ライセンスが回ってきました。

Java は3Q成果が実質2行、4QはDBリファクタリングした結果Java成果行数は負数になってて1日の作業時間の大半はIDEじゃなく、AWSコンソール、Mackerel、AppDynamics、ターミナルの人です。


# Database Tool Window

View | Tool Windows | Database

これで、PostgreSQLはもちろん、Oracle, SQLServer, MySQL, SQLite, Amazon Redshift まで接続してpgAdminのように VisualでDB操作できます。

気に入ったところ

- デフォールトでページネーション入ってる
  - 50行だったか500行だったか　もちろんどこかで設定可能 
  - うっかり巨大な結果が返ってくるSQL投げても割とすぐに制御を取り戻せる
- pgAdminIII が1000万行級Tableのprefetchだかなんだかで、分単位で固まってたのが、ストレスフリーに
  - 同じ接続先なので、サーバ側性能差はまったくなし
  - クライアント側の「作りこみ」の問題でしょうね
- ちょっとSQL書いてみても、補完アシストがかなりいい感じ

# Monster Query Hunter に IntelliJ IDEAを持たせると 

[Monster Query Hunter](https://qiita.com/masudakz/items/b63165197b8e320d5a06) を書いたのが1年以上前になりました。現代的な道具を手にすると、どんなハンティングになるのか、見ていただきましょう。

## AppDynamics で SlowSQL をみつける

AppDynamics で `Database Calls | Slowest Database Calls` に行けばすぐ採取できます。
1年前のはPostgreSQLログから採取してました。

![appdyna_chu_slow_sql.png](https://qiita-image-store.s3.amazonaws.com/0/47549/66f2a6a4-d798-15d3-1d4e-55b05cda933f.png)

![appdyna_chu_slow_sql2.png](https://qiita-image-store.s3.amazonaws.com/0/47549/ab2d5aa1-e1b0-c375-9044-c366e5717897.png)

## IntelliJ IDEA Database Consoles にペースト

長いSQLにたくさんパラメータが混じってますが気にしない。そのまま貼り付けます。

![intellij_chu_slow_sql1.png](https://qiita-image-store.s3.amazonaws.com/0/47549/f9fddbeb-5927-9f77-6b2c-e80e9b264691.png)

## SQLフォーマッタ

`Code | Reformat Code`
![intellij_chu_slow_sql2.png](https://qiita-image-store.s3.amazonaws.com/0/47549/bf9dbac6-baaf-8f18-1b48-b7e49b0e95d1.png)

リフォーマット後
![intellij_chu_slow_sql3.png](https://qiita-image-store.s3.amazonaws.com/0/47549/a609e0bd-3b7b-a302-6989-63c95129923c.png)

Beautiful!　圧倒的な見通しの良さ!

## SQL部分実行・パラメータ化された文の実行

Long Long query なのでいきなり全部を理解しようとはしません。まずは最初の WITH句です。
選択した範囲だけを実行できます。

そこにパラメータ置換文字が入っていたら対話的に聞いてくれます。

「published?  日付かな？」と入れて見た図
![intellij_chu_slow_sql4.png](https://qiita-image-store.s3.amazonaws.com/0/47549/a9eea83e-6c66-bf95-a859-4c72445ba4ce.png)

下のOutput にエラーが出ちゃった。
```
[2019-02-15 17:32:50] [22P02] ERROR: invalid input syntax for integer: "2019-02-15"
[2019-02-15 17:32:50] ポジション: 43
```

この列はinteger なんだ。でも、値域がわからない。ぼくの作ったTableじゃないから。
助けてよ～ IntelliJ～

## クイック評価

しかたないな～　「クイック評価～」
Table名のところをポイントして、Ctrl+Alt+F8
![intellij_chu_slow_sql5.png](https://qiita-image-store.s3.amazonaws.com/0/47549/3b9fa0ee-03bd-dd5e-1f00-2ae740a222b1.png)

textbook から実際に2行取り出したポップアップが出てくれる。ここの `published` を見れば、4桁西暦だってわかるだろ。

ポップアップのMoreを使えばもう少しサンプル増やすこともできる。

## Explain to Table

PostgreSQLの `EXPLAIN <sql> ` の出力は、[アプリケーションエンジニアのための実行計画](https://qiita.com/sugai/items/6905f66eaebbac05f3a2) にあるように、インデントされて、文字列、数字が一杯のもので、人間に読みやすいものではありません。

IntelliJでもRaw出力だとこうです。
![intellij_chu_slow_sql8.png](https://qiita-image-store.s3.amazonaws.com/0/47549/72152d7d-5831-7904-4dc1-dde368a41b29.png)

いやまあ、コンテキストメニュー（右クリック）からSQLの一部でも全体でもさくっと EXPLAIN が採取できるのは有り難いんですが、とくに Long Long queryの場合の結果を読むのは辛い。

それが  `Explain Plan (Raw)`　じゃなくて、`Explain Plan` の方を使うとこうなるのです。
![intellij_chu_slow_sql7.png](https://qiita-image-store.s3.amazonaws.com/0/47549/4e805115-c5df-fe25-30fc-9535b5c9402b.png)


Beautiful!
Rows と Cost が表形式に整列されて、比較が一瞬のうちにできる。どこが律速しているか一目瞭然。
おまえや、このNestedLoopJoinの5連発！

※この機能は中国地方DB勉強会 in 岡山(2019-02-02)で教わりました。
https://speakerdeck.com/maepon/sqlturu-number-chugokudb?slide=23

# 結論

**MUST BUY**

DBAにとっても、IntelliJ IDEA はおっそろしく有用なToolです。
「統合開発環境」IntelliJ IDEAは、これまで使ってた Eclipse + SourceTree + pgAdmin が1つになって、ツール切り替えに伴う、人間の頭のスイッチング時間がなくなります。なくなって初めて、ここにストレスかかってたんだと気がつきます。
一度試用したら、これなしの仕事には戻れません。
試用ライセンスが万一失効してライセンス貸与されなかったら、IntelliJ IDEA のある環境に移ることを考え出すくらいには。

（追記）無事、試用ライセンスから、正規ライセンスにしてもらえました。