以前、SQL Database の新しいエディションの特性を調べてみる という投稿をしました。
Azure SQL Database の更新情報: 新しいサービス レベルへの容易なアップグレード、パフォーマンスの向上、Basic データベースで PITR (ポイントインタイム リストア) をサポート、すべてのサービス レベルで自動エクスポートをサポート で紹介されているのですが、7 月になって Basic / Standard S1 / Standard S2 の DTU 数が変更され以下のようになりました。
![]()
日本語の情報はまだパフォーマンスの向上前の DTU 数になっていてので比較対象として使用しているのですが、上が向上前 / 下が向上後の DTU の情報となります。
Azure SQL データベースのサービス階層とパフォーマンス レベル
Azure SQL Database Service Tiers and Performance Levels
| パフォーマンスレベル | 向上前 | 向上後 |
| Basic | 1 | 5 |
| Standard/S1 | 5 | 15 |
| Standard/S2 | 25 | 50 |
Twitter を見ていたら、熊なのになぜか頻繁に猫と合成される数奇な人生を送るシグマクンから以下のようなお手紙をいただいていました。
# プライバシー保護のため一部モザイク化、モザイクの下に何があるかはご想像にお任せします m(_ _)m ![]()
ということでちょっと評価してみたいと思います。
評価に使用する方法は以前と同じ手法を使用しています。
評価用のテーブルを作成して、INSERT の性能特性を見るパターンと、
SET NOCOUNT ON
GO
CREATE TABLE Table_1
(
c1 uniqueidentifier,
c2 char(1000),
CONSTRAINT PK_Table_1 PRIMARY KEY (c1)
)
GO
SELECT * FROM sys.dm_db_wait_stats ORDER BY wait_type ASC
GO
INSERT INTO Table_1 VALUES(NEWID(), NEWID())
GO 5000
SELECT * FROM sys.dm_db_wait_stats ORDER BY wait_type ASC
GO
複数のセッションから以下のクエリを実行して、SELECT の性能特性を見るパターンを実施しています。
SELECT COUNT(*) FROM Table_1 WITH (NOLOCK) ORDER BY NEWID()
まずは、INSERT 特性から見てみたいと思います
以下は処理時間の比較となります。
| 処理時間 | 前回 | 今回 |
| Business | 1:53 | 2:03 |
| Basic | 9:19 | 2:08 |
| Standard/S1 | 4:35 | 1:56 |
| Standard/S2 | 3:03 | 1:58 |
Business ~ S2 までほぼ同じ時間で処理が完了しました。
前回はパフォーマンスレベルに応じて処理時間にばらつきがあったのですが、今回は同一となっています。
Basic が以前の S1 相当になったので、それぐらいの処理時間になるかと思ったのですが、処理時間はそれ以上に向上していました。
それでは、待ち事象も確認してみたいと思います。
| wait_type | Business | Basic | S1 | S2 | ||||
| Count | Time (ms) | Count | Time (ms) | Count | Time (ms) | Count | Time (ms) | |
| ASYNC_TRANSPORT_STREAM | 2 | 0 | 2 | 0 | 1 | 0 | 2 | 0 |
| CMEMTHREAD | 3 | 0 | 10 | 1 | ||||
| LATCH_SH | 0 | 0 | 0 | 0 | ||||
| LOG_RATE_GOVERNOR | 14 | 349 | 141 | 1,523 | ||||
| PAGEIOLATCH_EX | 1 | 9 | 0 | 0 | ||||
| PAGEIOLATCH_SH | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| PAGEIOLATCH_UP | 2 | 13 | 2 | 2 | 2 | 1 | 2 | 1 |
| PAGELATCH_EX | 2 | 0 | 4 | 0 | 4 | 0 | 4 | 0 |
| PAGELATCH_SH | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| RESOURCE_GOVERNOR_IDLE | 31 | 410 | 1 | 1 | 0 | 0 | ||
| SE_REPL_COMMIT_ACK | 5,000 | 13,608 | 5,000 | 13,579 | 5,000 | 12,929 | 5,000 | 12,672 |
| SE_REPL_QUEUE_TRUNCATE | 1 | 0 | ||||||
| SE_REPL_QUEUE_XACT_ACK | 3 | 0 | 0 | 0 | 1 | 0 | 1 | 0 |
| SOS_SCHEDULER_YIELD | 37 | 1 | 73 | 5,488 | 66 | 9 | 65 | 26 |
| WRITE_COMPLETION | 4 | 3 | 8 | 65 | 8 | 8 | 8 | 6 |
| WRITELOG | 5,002 | 7,412 | 5,004 | 8,248 | 5,004 | 7,055 | 5,004 | 7,059 |
注目する必要がある待ち事象は 3 種類になると考えています。
- LOG_RATE_GOVERNOR
- RESOURCE_GOVERNOR_IDLE
- WRITELOG
それでは、前回取得した内容と比較をしてみます。
| wait_type | Basic (前回) | Basic (今回) | ||
| Count | Time (ms) | Count | Time (ms) | |
| ASYNC_TRANSPORT_STREAM | 3 | 0 | 2 | 0 |
| CMEMTHREAD | 36 | 4 | 3 | 0 |
| LATCH_SH | ||||
| LOG_RATE_GOVERNOR | 8,956 | 435,217 | 14 | 349 |
| PAGEIOLATCH_EX | 1 | 1 | ||
| PAGEIOLATCH_SH | 0 | 0 | 0 | 0 |
| PAGEIOLATCH_UP | 1 | 0 | 2 | 2 |
| PAGELATCH_EX | 2 | 0 | 4 | 0 |
| PAGELATCH_SH | 0 | 0 | ||
| RESOURCE_GOVERNOR_IDLE | 0 | 0 | 31 | 410 |
| SE_REPL_COMMIT_ACK | 5,000 | 14,726 | 5,000 | 13,579 |
| SE_REPL_QUEUE_TRUNCATE | 1 | 0 | ||
| SE_REPL_QUEUE_XACT_ACK | 6 | 1 | 0 | 0 |
| SOS_SCHEDULER_YIELD | 1 | 0 | 73 | 5,488 |
| WRITE_COMPLETION | 4 | 3 | 8 | 65 |
| WRITELOG | 5,002 | 9,655 | 5,004 | 8,248 |
| wait_type | S1 (前回) | S1 (今回) | ||
| Count | Time (ms) | Count | Time (ms) | |
| ASYNC_TRANSPORT_STREAM | 3 | 0 | 1 | 0 |
| CMEMTHREAD | 4 | 0 | 10 | 1 |
| LATCH_SH | 0 | 0 | ||
| LOG_RATE_GOVERNOR | 5,407 | 162,228 | 141 | 1,523 |
| PAGEIOLATCH_EX | 2 | 1 | 0 | 0 |
| PAGEIOLATCH_SH | 0 | 0 | 0 | 0 |
| PAGEIOLATCH_UP | 1 | 0 | 2 | 1 |
| PAGELATCH_EX | 1 | 0 | 4 | 0 |
| PAGELATCH_SH | 0 | 0 | ||
| RESOURCE_GOVERNOR_IDLE | 1 | 7 | 1 | 1 |
| SE_REPL_COMMIT_ACK | 5,000 | 13,676 | 5,000 | 12,929 |
| SE_REPL_QUEUE_TRUNCATE | 0 | 0 | ||
| SE_REPL_QUEUE_XACT_ACK | 0 | 0 | 1 | 0 |
| SOS_SCHEDULER_YIELD | 15 | 14 | 66 | 9 |
| WRITE_COMPLETION | 4 | 4 | 8 | 8 |
| WRITELOG | 5,002 | 8,021 | 5,004 | 7,055 |
| wait_type | S2 (前回) | S2 (今回) | ||
| Count | Time (ms) | Count | Time (ms) | |
| ASYNC_TRANSPORT_STREAM | 2 | 0 | 2 | 0 |
| CMEMTHREAD | 0 | 0 | ||
| LATCH_SH | 0 | 0 | ||
| LOG_RATE_GOVERNOR | 2,831 | 62,191 | ||
| PAGEIOLATCH_EX | 0 | 0 | ||
| PAGEIOLATCH_SH | 0 | 0 | 0 | 0 |
| PAGEIOLATCH_UP | 1 | 0 | 2 | 1 |
| PAGELATCH_EX | 3 | 0 | 4 | 0 |
| PAGELATCH_SH | 0 | 0 | ||
| RESOURCE_GOVERNOR_IDLE | 0 | 0 | 0 | 0 |
| SE_REPL_COMMIT_ACK | 5,000 | 12,977 | 5,000 | 12,672 |
| SE_REPL_QUEUE_TRUNCATE | 0 | 0 | ||
| SE_REPL_QUEUE_XACT_ACK | 0 | 0 | 1 | 0 |
| SOS_SCHEDULER_YIELD | 24 | 0 | 65 | 26 |
| WRITE_COMPLETION | 4 | 3 | 8 | 6 |
| WRITELOG | 5,002 | 7,724 | 5,004 | 7,059 |
LOG_RATE_GOVERNOR の待ち事象が大幅に減少していることが確認できます。
DTU のパフォーマンス向上によって、この調整機構の閾値に変更 (もしくは調整機構のチューニング) が行われ、書き込み性能が向上したものと思われます。
それでは、読み取り性能を確認してみたいと思います。
左上から Business/Basic/S1/S2 となります。
前回の取得結果と比較してみたいと思います。
| 前回 | 今回 | |||
| 処理時間 | エラー数 | 処理時間 | エラー数 | |
| Business | 00:07.3908 | 0 | 00:06.8152 | 0 |
| Basic | 01:57.4251 | 883 | 02:16.9123 | 0 |
| S1 | 02:28.5198 | 0 | 00:46.5336 | 0 |
| S2 | 00:27.2976 | 0 | 00:13.8427 | 0 |
| P1 | 00:08.8606 | 0 | ||
| P2 | 00:07.2884 | 0 | ||
現行の Business に関しては処理時間に差はありません。
# 当然の結果ではありますが。
Basic については処理時間に大差はありませんが、エラー数に差が出ており、前回の S1 相当の内容となっています。
S2 については現行エディションのの性能と同等まではいきませんが、前回と比較して性能は向上していますね。
前回は取得していなかったのですが、SOS_SCHEDULER_YIELD にも差が出ているようです。
パフォーマンスレベルによって、CPU の仕様傾向にも差が出てくるようですね。
| Count | Time (ms) | |
| Business | 4 | 4 |
| Basic | 10 | 16,150 |
| S1 | 8 | 3,158 |
| S2 | 14 | 1,307 |
性能面で見ると今回のパフォーマンス向上のアップデートにより、全体的な性能が向上した傾向は取得できました。