SQL Server 2016 の AlwaysOn の機能拡張として、セカンダリレプリカの Redo スレッドの並列化 (マルチスレッド) による性能向上があるかと思います。
SQL Server 2014 までは、可用性グループの DB 毎に Redo スレッドが起動していたものが並列化されたことで、1Gbps のログの転送といったことが可能となったのが SQL Server 2016 なのですが、この辺の動作をデモで見える形で取得できないかなと思ったのが今回のお話です。
SQL Server 2014 では、Troubleshooting REDO queue build-up (data latency issues) on AlwaysOn Readable Secondary Replicas using the WAIT_INFO Extended Event のような形で確認ができていたと思うのですが、2016 でどのように取れるのかなと。
待ち事象としては並列化されたものが増えているようですね。
select * from sys.dm_os_wait_stats where wait_type LIKE '%REDO%' order by wait_type
スレッド数ですが情報の通り、CPU 数によって変わってくるようです。
プライマリで更新をかけているタイミングで、セカンダリで以下のクエリを実行してみます。
SELECT db_name(database_id) as DBName FROM sys.dm_exec_requests WHERE command = 'DB STARTUP' select count(*) from sys.dm_os_workers where last_wait_type like '%REDO%'
上が 8 / 下が 32 を SQL Server のスケジューラーとして認識させた状態の情報となります。
8 の場合は 6 のワーカーが、32 の場合は、18 のワーカーが起動していることが確認できますね。
CPU 数に応じて、Redo スレッドの数が異なるというデモはこれでできるのかなと。