Dr.Sum 新機能「DS Script」でテーブルをローテーションする

# はじめに
Dr.Sum は大量データを高速集計可能なデータベースです。
ライセンスによって1テーブルあたりの格納可能なデータ件数が異なるため、
今回は1テーブルのデータ件数の上限に近づくと自動でテーブルをローテーションする仕組みを作成します。

データが継続的に発生し、大量のデータを蓄積するような運用の場合、格納するテーブルを交代しながらデータを格納することができるためインポートの運用を止めずに安全にローテーションすることができます。

テーブルローテーションのイメージは以下となります。
※画像は公式のマニュアルを参照。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657532/c94fa315-a13a-07f6-9625-8f060e254c85.png)


#### 本記事について
 記載する記事の情報は個人的なものです。各製品に関する公式な情報は、会社 HP・マニュアル等を参照してください。
#### 参考記事
- [Dr.Sum 新機能「DS Script」をはじめて使ってみた](https://qiita.com/sugiyama_shinichi/items/cddafa482ef7af0785b8)
- [Dr.Sum マニュアル](https://cs.wingarc.com/manual/drsum/5.6/index.html?lang=ja)
- [TECH BLOG（Dr.Sum）](http://navi.wingarc.com/drsum/)

# 目次
1. Dr.Sum とは

2. DS Script とは

3. DS Scriptでテーブルローテーションしてみる

4. まとめ

# Dr.Sum とは

[Dr.Sum](https://cs.wingarc.com/manual/drsum/5.6/ja/UUID-9f9bbc60-a213-ee1a-300c-6838c5fe4e92.html) は、経営や営業などの業務の現場で、企業内の基幹データベースの情報を高速に集計できるBIツールです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657532/34acb603-a6a4-c0d7-2274-f7cf9c1c2960.png)


※キャプチャはウイングアーク1st社のホームページより抜粋
https://www.wingarc.com/product/dr_sum/

# DS Script とは

[DS Script](https://cs.wingarc.com/manual/drsum/5.6/ja/UUID-b72e37d1-3ca2-226d-23e7-66c5781a848a.html) とは、データ準備作業で実施するバッチ処理やデータ加工処理（前処理）を支援するためのスクリプト言語のこと。
開発環境も用意されており今まで煩雑になりやすかったバッチファイルなどの実行ファイル、SQL文、Dr.Sumが提供するコマンドを1つのスクリプトとして定義できるらしい。

下図のようなIDEが用意されておりブロックをドラックアンドドロップで配置することでスクリプトを作成することが可能。
ブロックモードとテキストモードの互換性があるため結構使いやすい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657532/a8a8ac6f-7bc2-5c85-48ca-9a0e0e05997c.png)


# DS Scriptでテーブルローテーションしてみる

## （1）データの用意
今回はサンプルとしてtable1という100万件のデータが格納されたテーブルを用意しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657532/c7ce567c-361a-267f-54be-b70130c1fbf5.png)


## （2）DS Script でコマンドブロックを配置

今回はtable1のデータ件数によって処理を分岐させるため以下のような処理を行いました。

 - **処理１**
対象となるDBへ接続
使用したコマンドブロック　➡　［データベース］-［CONNECT］

 - **処理2**
対象のテーブル件数をカウントし変数へ格納
使用したコマンドブロック　➡　［変数］-［SET_FROM_QUERY］

 - **処理3**
CASE式を利用し条件分岐
使用したコマンドブロック　➡　［制御フロー］-［CASE］

 - **処理4**
countが100万件であればローテーションのSQLを実行
使用したコマンドブロック　➡　［データベース］-［SQL］


とりあえずコマンドブロックを配置してみるとこうなる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657532/5104feee-141f-4251-b036-854579df105a.png)

構文とかはよくわからないので処理フローだけコマンドブロックでささっと作ってしまって
あとはテキストモードで引数や呼び出す関数だけ変えることができるのはとても便利だと感じた

## （3）テキストモードに切り替えてスクリプトの作成

処理のフローはコマンドブロックで簡単に作成できたため、SQLとそれぞれのコマンドブロックの引数を書き換えていく

　**処理１**
　接続先となるデータベースを選択

```
CONNECT("TEST_dhn") {
}
```
　**処理2**
　レコード数を取得し変数へ格納

```
SET_FROM_QUERY() {
    ($count_table)
        = select count(*) from table1;
}
```
　**処理3＋処理4**
　テーブル件数に応じて処理を分岐してローテーションする
　今回は処理をわかりやすくするためテーブル件数が100万件以上のときテーブルローテーションするように設定

```
CASE {
    WHEN ($count_table >= 1000000) {
        SQL($_SQL_AUTO_COMMIT_ON) {
            ROTATE TABLE table1;
        }
    }
}
```

## （4）作成したスクリプトを実行してみる
テスト実行を行うと以下のようにデバッグログが出力されスクリプトが正しく動作したことが確認できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657532/fed1d74f-8aee-a0ac-0d7c-cd88670ad09d.png)

## （5）テーブルの確認

最後にテーブルを確認する。
table1_yyyyMMddHHmm が新規で作成されておりオリジナルのテーブル件数が0となっていたため
DS Scriptを利用してテーブルがローテーションされていることが確認できた

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657532/b4c2cceb-e09c-cd08-520b-bf56d19f0588.png)

# まとめ

以上でDS Scriptを実行してテーブルをローテーションさせることができました。
作成したスクリプトを定期的に実行することでデータ件数による対応を自動化することができる。
データが継続的に発生し、大量のデータを蓄積するような設備機器のデータやIoT関連のデータにとても有効です。

Dr.SumにはIoTのデータをリアルタイムに受け取ることができるFunnelという機能も用意されているのでこれら組み合わせることでデータ収集から運用までの仕組みを簡単に構築できるかもしれません。