HammerDB(CLI)でSQL Serverに負荷をかける

# はじめに

HammerDBでSQL ServerにCLIで負荷をかける手順のメモです。

 * ベンチマーク実行環境はWindows10。＜ODBC Driver 17 for SQL Server＞で接続
 * Windowsサーバ（VirtualBox上のVM）のSQL Server 2019に対して実行
 * ベンチマーク用のDBの作成、必要な構成（ログイン作成、権限付与、SQL認証の許可など）は実施済み
 * HammerDBスキーマの作成は実施済み
 * HammerDBはv3.3

# 実施手順

## 事前作業（ODBC SQL Server のドライバーのバージョン設定）


HammerDB v3.3ではデフォルトのドライバが「ODBC Driver 13 for SQL Server」になっています。
「ODBC Driver 17 for SQL Server」など別のODBCのバージョンに変更する場合、 hammerdbインストールディレクトリのconfigの下のmssqlserver.xmlをエディタで開き、11行目を編集します。

```
	<mssqls_odbc_driver>ODBC Driver 13 for SQL Server</mssqls_odbc_driver>
　　→
	<mssqls_odbc_driver>ODBC Driver 17 for SQL Server</mssqls_odbc_driver>
```

後述のdisetでは、mssqls_odbc_driverの設定はエラーが発生します。

```
hammerdb>diset connection  mssqls_odbc_driver  "ODBC Driver 17 for SQL Server"
Clearing Script, reload script to activate new setting
Script cleared
Error: Driver script must be either "test" or "timed"
```

ソースコードの以下の部分の判定がうまくいってないようだけど、とりあえず深追いはせず。

```
        if { [ string match *driver $key2 ] && ![ string match *odbc_driver $key2 ] } {
```





## HammerDB CLIを起動する

hammerdbcliを実行します。

`C:\Program Files\HammerDB-3.3\hammerdbcli.bat`

`hammerdb>`　というプロンプトが返されます。

## DBをSQL Serverに設定する

`dbset db mssqls`

```
hammerdb>dbset db mssqls
Database set to MSSQLServer

hammerdb>print db
Database MSSQLServer set.
To change do: dbset db prefix, one of:
Oracle = ora MSSQLServer = mssqls Db2 = db2 MySQL = mysql PostgreSQL = pg Redis = redis
```

## ベンチマークタイプをTPC-Cに設定する


`dbset bm TPC-C`

```
hammerdb>dbset bm TPC-C
Benchmark set to TPC-C for MSSQLServer

hammerdb>print bm
Benchmark set to TPC-C
```

## パラメータの指定

### 現在の設定値を確認する

現在の設定を確認します。

`print dict`　

```
hammerdb>print dict
Dictionary Settings for MSSQLServer
connection {
 mssqls_server         = (local)
 mssqls_linux_server   = localhost
 mssqls_tcp            = false
 mssqls_port           = 1433
 mssqls_azure          = false
 mssqls_authentication = windows
 mssqls_linux_authent  = sql
 mssqls_odbc_driver    = ODBC Driver 17 for SQL Server
 mssqls_linux_odbc     = ODBC Driver 17 for SQL Server
 mssqls_uid            = sa
 mssqls_pass           = admin
}
tpcc       {
 mssqls_count_ware       = 1
 mssqls_num_vu           = 1
 mssqls_dbase            = tpcc
 mssqls_imdb             = false
 mssqls_bucket           = 1
 mssqls_durability       = SCHEMA_AND_DATA
 mssqls_total_iterations = 1000000
 mssqls_raiseerror       = false
 mssqls_keyandthink      = false
 mssqls_checkpoint       = false
 mssqls_driver           = test
 mssqls_rampup           = 2
 mssqls_duration         = 5
 mssqls_allwarehouse     = false
 mssqls_timeprofile      = false
 mssqls_async_scale      = false
 mssqls_async_client     = 10
 mssqls_async_verbose    = false
 mssqls_async_delay      = 1000
}
```

### パラメータの設定

変更したいパラメータの設定を以下で行います。

`diset dict key value`

いくつか例を記載します。

#### 接続するサーバの変更

IPアドレスの指定とTCPでの接続を許可します。

```
diset connection  mssqls_server 192.168.x.x
diset connection  mssqls_tcp  true
```

#### 認証方式とユーザ名パスワードを変更

SQL認証にします。またデータベースのユーザ名とパスワードを指定します。

```
diset connection  mssqls_authentication  sql
diset connection  mssqls_uid             loaduser
diset connection  mssqls_pass            loaduser
```

#### ドライバースクリプトを変更

測定用のtimedにします。

```
diset tpcc mssqls_driver timed
```

#### データベース名を変更

データベース名をtpcc_aに変更します。

```
diset tpcc mssqls_dbase tpcc_a
```

### 変更後の設定値を確認する

設定が変更されていることを確認します。

```
hammerdb>print dict
Dictionary Settings for MSSQLServer
connection {
 mssqls_server         = 192.168.x.x
 mssqls_linux_server   = localhost
 mssqls_tcp            = true
 mssqls_port           = 1433
 mssqls_azure          = false
 mssqls_authentication = sql
 mssqls_linux_authent  = sql
 mssqls_odbc_driver    = ODBC Driver 17 for SQL Server
 mssqls_linux_odbc     = ODBC Driver 17 for SQL Server
 mssqls_uid            = loaduser
 mssqls_pass           = loaduser
}
tpcc       {
 mssqls_count_ware       = 1
 mssqls_num_vu           = 1
 mssqls_dbase            = tpcc_a
 mssqls_imdb             = false
 mssqls_bucket           = 1
 mssqls_durability       = SCHEMA_AND_DATA
 mssqls_total_iterations = 1000000
 mssqls_raiseerror       = false
 mssqls_keyandthink      = false
 mssqls_checkpoint       = false
 mssqls_driver           = timed
 mssqls_rampup           = 2
 mssqls_duration         = 5
 mssqls_allwarehouse     = false
 mssqls_timeprofile      = false
 mssqls_async_scale      = false
 mssqls_async_client     = 10
 mssqls_async_verbose    = false
 mssqls_async_delay      = 1000
}
```


## テストスクリプトのロード

ここまでの設定をロードします。
`loadscript`


```
hammerdb>loadscript
TPC-C Driver Script
Script loaded, Type "print script" to view
```


## スキーマの作成

スキーマ作成済みの前提なので、スキーマの作成はスキップします。まだの場合は以下を実施します。

`buildschema`





## 仮想ユーザの設定

### 現在の設定値を確認する

現在の仮想ユーザの設定値を確認します。

`print vuconf`

```
hammerdb>print vuconf
Virtual Users = 1
User Delay(ms) = 500
Repeat Delay(ms) = 500
Iterations = 1
Show Output = 1
Log Output = 0
Unique Log Name = 0
No Log Buffer = 0
Log Timestamps = 0
```

### 仮想ユーザの設定

設定は`vuset `で行います。
ここでは仮想ユーザを2に変更します。

```
hammerdb>vuset vu 2
```

### 変更後の設定値を確認する

設定が変更されていることを確認します。

```
hammerdb>print vuconf
Virtual Users = 2
User Delay(ms) = 500
Repeat Delay(ms) = 500
Iterations = 1
Show Output = 1
Log Output = 0
Unique Log Name = 0
No Log Buffer = 0
Log Timestamps = 0
```

## 仮想ユーザの作成

`vucreate`で仮想ユーザを作成します。

```
hammerdb>vucreate
Vuser 1 created MONITOR - WAIT IDLE
Vuser 2 created - WAIT IDLE
Vuser 3 created - WAIT IDLE
3 Virtual Users Created with Monitor VU

hammerdb>vustatus
1 = WAIT IDLE
2 = WAIT IDLE
3 = WAIT IDLE
```

## ベンチマークの実行

`vurun`にてロードしたスクリプトを作成した仮想ユーザーで実行させます。
完了するまで待ちます。

```
hammerdb>vurun
RUNNING - SQL Server TPC-C
Vuser 1:RUNNING
Vuser 2:RUNNING
Vuser 1:Beginning rampup time of 2 minutes
Vuser 2:Processing 1000000 transactions with output suppressed...
Vuser 3:RUNNING

＜中略＞

Vuser 1:Test complete, Taking end Transaction Count.
Vuser 1:2 Active Virtual Users configured
Vuser 1:TEST RESULT : System achieved 26853 SQL Server TPM at 11639 NOPM
Vuser 1:FINISHED SUCCESS
Vuser 3:FINISHED SUCCESS
Vuser 2:FINISHED SUCCESS
ALL VIRTUAL USERS COMPLETE
TPC-C Driver Script
hammerdb>
```

#参考

 * Chapter 8. Command Line Interface (CLI)  https://hammerdb.com/docs/ch08.html
 * HammerDBをCLIで使うなど：まとめ、あるいは、目次の代わりに  https://atsuizo.hatenadiary.jp/entry/2019/09/09/090000
 * HammerDB を使用した SQL Server の負荷テスト https://cloud.google.com/compute/docs/tutorials/load-testing-sql-server-hammerdb?hl=ja
 * ODBC SQL Server のドライバーのバージョンを確認する方法 (Windows)
https://docs.microsoft.com/ja-jp/sql/database-engine/configure-windows/check-the-odbc-sql-server-driver-version-windows?view=sql-server-ver15