Azure SQLからAzureVM上のSQL Serverに移行する際は、分離レベルが異なることに注意が必要

2013-12-28

SQL Server Customer Advisory TeamのBlogに投稿された「Be aware of the difference in isolation levels if porting an application from Windows Azure SQL DB to SQL Server in Windows Azure Virtual Machine」をベースにした投稿です。

Windows Azure SQL DatabaseからWindows Azure Virtual Machine上のSQL Server(オンプレミスのSQL Server)に移行する際に、性能問題に遭遇することがあります。
原因として、分離レベルの違いからロック待ち事象(lock wait)が高くなっている可能性があげられます。

Azure SQLでは、デフォルトで、READ COMMITTED SNAPSHOTとSNAPSHOT ISOLATIONが有効になっています。
SQL Serverでは、デフォルトで、READ COMMITTED SNAPSHOTとSNAPSHOT ISOLATIONが無効になっています。

参考:確認用SQL
select name, snapshot_isolation_state, is_read_committed_snapshot_on from sys.databases

READ COMMITTED SNAPSHOT ISOLATION (RCSI)を前提にしたアプリケーションをそれぞれの環境でロードテストして見たところ次のような結果になりました。

データ格納先 アプリケーションレスポンスタイム アプリケーションスループット
Azure SQL 0.83 38
WinVM上のSQL Server 2.94 13.9

これだけの差がついた原因は、パフォーマンスカウンター(“Lock Waits” under object => “SQL Server:Wait Statistics”, instance => “Average wait time (ms)”)を確認すると判明しました。ロックのwait平均時間が1秒程度かかっていました。

RCSIを有効にして、ロック待ち時間を数ミリセカンドにまで減らすと次のような結果になり、性能改善できました。

データ格納先 アプリケーションレスポンスタイム アプリケーションスループット
WinVM上のSQL Server:既定 2.94 13.9
WinVM上のSQL Server:RCSI 1.14 34.8

注意事項

RCSIを有効にすると、SQL ServerではバージョンストアをTEMPDBに格納するため、TMPDBに注意する必要があります。たとえば、あるシナリオでは、次のようなTEMPDBのディスクI/Oスループットに差がでました。

データ格納先 Disk Read Bytes/sec Disk Writes Bytes/sec
WinVM上のSQL Server:既定 403,031 1,504,410
WinVM上のSQL Server:RCSI 26,570,531 58,219,559