BluemixでAnalytics 〜dashDBをSQLで操作してみる


[前回](http://qiita.com/saboten10/items/74f4c2bd2b65c59df41c)は、dashDB上に新規にテーブルを作成して、あらかじめ用意したCSV形式のデータをロードしました。
一つのCSVファイルが３００MBくらいあるものを４つロードしましたが割と現実的な時間でロードすることができました。一つのファイルのロードが大体１０分ほどですので、全体で４０分ほどでロードできる計算になります。
クラウド上のデータベースへのデータロードなんて現実的な時間で収まらないのかと思っていましたが、これくらいの時間であればオンプレミスで作ったデータベースへのロードと大差ない感じです。dashDBは、検索に特化したチューンがされていますのでロードとか遅いのかと思っていましたが全然問題ありません。

##SQLの実行
SQLはdashDBの管理画面のメニューから、 **Run SQL**を選択します。画面が表示されるとSQL文を入力することのできるエリアが表示されますので、ここにSQL文を打っていきます。
![スクリーンショット 2015-08-12 19.28.55.png](https://qiita-image-store.s3.amazonaws.com/0/89268/fc196e10-04e8-0027-bbef-2bd1b991fd79.png "スクリーンショット 2015-08-12 19.28.55.png")

dashDBはDB2系なので、SQL文法もDB2用のSQL文法になります。ただ、普通のSQL文を書いているうちには、どのRDBも同じようなものなので、あまり気にする必要はないようです。SQL文で困ったら、[IBMのDB2マニュアルページ](http://www-01.ibm.com/support/knowledgecenter/#!/SSEPGG/welcome)を参照してください。

実際に、SQL文を発行して、ロードしたデータ件数を確認します。
２６００万件入っています。結構なボリュームですが、結果は割とすぐに戻ってきます。
![スクリーンショット 2015-08-12 16.56.17.png](https://qiita-image-store.s3.amazonaws.com/0/89268/2ca1b520-e42d-4ace-0ab3-5f962f51d11b.png "スクリーンショット 2015-08-12 16.56.17.png")

**Option**を押すと設定画面が出てきます。
![スクリーンショット 2015-08-12 19.31.33.png](https://qiita-image-store.s3.amazonaws.com/0/89268/c95b2c58-ad01-763b-7986-e219a6f67b38.png "スクリーンショット 2015-08-12 19.31.33.png")
SQL文は複数行記述できますが、ディフォルトだと **Run**するとすべての行が実行されてしまいます。カーソル行だけを実行するようにしておくと便利かもしれません。

##ちょっとデータの内容を確認
テーブルに格納されているデータを簡単にSQLで検索して数値を把握しておきます。

```sql
-- 1) SampleSQL
-- SQL種類を取得してみる
select count(*) from 
	(select distinct sql_id from appl_log);
```
![スクリーンショット 2015-08-12 22.16.45.png](https://qiita-image-store.s3.amazonaws.com/0/89268/d6a72310-78dd-3da3-190f-dad844a914fb.png "スクリーンショット 2015-08-12 22.16.45.png")
SQLの種類は2061種類でした。一応全レコードを検索することになりますが、１秒ちょっと。
次に各SQLごとの処理時間を分析してみます。

```sql
-- 2) SampleSQL
-- 平均応答時間が1000(ms)より大きい条件で
-- SQLごとに呼び出し回数、最小、平均、最大処理時間を取得
select sql_id, count(*) as sql_count ,
	min(erapsed_time) as min,
	avg(erapsed_time) as avg,
	max(erapsed_time) as max 
	from appl_log group by sql_id 
	having avg(erapsed_time) > 1000 
	order by sql_count desc;
```
![スクリーンショット 2015-08-12 22.17.42.png](https://qiita-image-store.s3.amazonaws.com/0/89268/4be88e74-c9b4-4652-b304-6a5fca31ce12.png "スクリーンショット 2015-08-12 22.17.42.png")
４秒くらいかかりましたが2600万件を扱っていると思うとかなり速い。（しかも処理時間の計算も含んでいるし）

```sql
-- 3) SampleSQL
-- 呼び出し回数が500より大きく
-- 平均応答時間が1000(ms)より大きい条件で
-- 最大応答時間が記録された時刻を取得
select appl_log.sql_id, 
	tmp.sql_count,
	erapsed_time as max_erapsed,
	time_string 
	from appl_log , 
		(select sql_id, 
			count(*) as sql_count ,
			min(erapsed_time) as min,
			avg(erapsed_time) as avg,
			max(erapsed_time) as max
			 from appl_log 
			 group by sql_id
 			 having avg(erapsed_time) > 1000 
  				and count(*) > 500 
 			 order by sql_count desc) tmp
	where erapsed_time=tmp.max;
```
![スクリーンショット 2015-08-12 22.18.44.png](https://qiita-image-store.s3.amazonaws.com/0/89268/df20c5ba-dc40-5c9d-22e3-9e3bd7af8a1e.png "スクリーンショット 2015-08-12 22.18.44.png")

これは２つ目のSQLを副照会で含んでいるけど２つ目よりも速い結果になりました。
内容はSQLごとに最大処理時間が発生した時刻を表示させています。アプリケーション担当者からは、朝一の処理が遅いという打ち上げがあったため調べてみました。これを見ると、最遅の処理時間を記録した時間は午前中が多そうですが、一概に朝一とも言えません。
<p><img src="https://qiita-image-store.s3.amazonaws.com/0/89268/eee64c94-4075-b7a7-ea93-cd98fa3f0651.png" alt="screen shot" width="600" /></p>

SQLでも色々な分析はできますが、Rを使った分析に移ります。

##接続情報
今回はBlueMix上に用意されているdashDB管理画面を操作していますが、外部のDB接続用ツールからdashDBへ接続してSQLなどを発行することもできます。
メニューの **Connection > Connection Information**を選択すると外部から接続するために必要な接続情報が表示されます。これを使えば普段使い慣れているツールから操作ができて便利です。
![スクリーンショット 2015-08-12 20.06.09.png](https://qiita-image-store.s3.amazonaws.com/0/89268/535e3f14-a639-557d-e5e2-875c41281d1f.png "スクリーンショット 2015-08-12 20.06.09.png")

セットアップできてしまえば普通のRDBと同じように利用できます。特にインデックスも張っていないテーブルですが、処理速度は良好に感じます。
今利用しているBluemixのdashDBはEntryプランなので、一つのサーバーを複数ユーザーでシェアしています。このため実行する時間帯によって処理速度はバラつくとは思いますが、それでもこれくらいの処理時間が済むというのは、十分な処理速度かと思います。
同じデータで何か他のRDB製品と比較してみたいですが、それはまた今度にします。

##次回
いよいよ、このデータをRを使って分析してみます。

***
シリーズ一覧
1.[BluemixでAnalytics 〜dashDBを作って見る](http://qiita.com/saboten10/items/75dce524abe42779e368)
2.[BluemixでAnalytics 〜dashDBにデータをロードしてみる](http://qiita.com/saboten10/items/74f4c2bd2b65c59df41c)
3.[BluemixでAnalytics 〜dashDBをSQLで操作してみる](http://qiita.com/saboten10/items/bf9c2b342ea6dc5cdfb9)
4.[BluemixでAnalytics 〜dashDBをRから使ってみる](http://qiita.com/saboten10/items/57c3ebb882656a9c5c35)
5.[BluemixでAnalytics 〜dashDBにR Studioから接続してみる](http://qiita.com/saboten10/items/ad537283fb1269ecb3fa)