SQL Server 2016 RC0 では、ALTER DATABASE SCOPED CONFIGURATION という ALTER 文がサポートされるようになりました。
これは SQL Database でもサポートされるようになっているようですね。
面白い機能だと思ったので軽く試してみました。
この機能ですが、DB 単位で、以下の設定の動作を変更できるようにするものとなります。
- MAXDOP
- LEGACY_CARDINALITY_ESTIMATION
- PARAMETER_SNIFFING
- QUERY_OPTIMIZER_HOTFIXES
クエリの並列度 / 基数推定 / パラメータスニッフィング / OPTIMIZER のホットフィックス適用動作を DB 単位で調整できるようになるのは面白いですね。
構文としては、以下のようになります。
USE [AGDB01] GO ALTER DATABASE SCOPED CONFIGURATION SET MAXDOP = 0 GO
この機能で面白いところのもう一つとして、「FOR SECONDARY」というオプションが使用できる点です。
これは、可用性グループで読み取り専用セカンダリーを使っている場合に、読み取り側の動作を変更できるものになります。
たとえば、
- PRIMARY : MAXDOP = 0
- SECONDARY : MAXDOP = 1
というような設定が可能です。
基数推定の変更や OPTIMIZER のホットフィックスの変更の影響をセカンダリ側で確認したのちに、プライマリに適用というようなこともできるため、セカンダリでクエリを実行する際のワークロードを変更できる感じでしょうか。
# プライマリとセカンダリで異なる設定ができるのがポイント
クエリとしては以下のようになります。
USE [AGDB01] GO ALTER DATABASE SCOPED CONFIGURATION SET MAXDOP = 0 GO ALTER DATABASE SCOPED CONFIGURATION FOR SECONDARY SET MAXDOP = 1 GO
これで、プライマリとセカンダリで、MAXDOP の設定が変わった状態となります。
設定については sys.database_scoped_configurations から確認することができます。
NULL となっている設定は「PRIMARY」が指定されており、プライマリと同一となっている設定となります。
上記の状態でプライマリとセカンダリで同じクエリを実行した結果が以下になります。
プライマリは MAXDOP を 0 にしているので並列クエリが実行されていますが、セカンダリは MAXDOP が 1 になっているため、並列クエリとしては実行されていません。
このような、プライマリとセカンダリで設定を変えることで、プランの確認をするというような用途でも使えるようです。
他に面白いのは、
ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE GO
でしょうか。
特定の DB のプランを消すというようなことができるようですね。
DB 単位での設定変更、実行プランの制御をする際に使う機会があるかもしれないですね。