SQL Server 2017 の自動チューニングの検証をしていて気付いたのですが、SQL Database でも SQL Server 2017 で実装される自動チューニングが使えるかもしれません。
Automatic tuning に記載されていますが、SQL Database の自動チューニングについては、インデックスの自動設定についての実装となっており、SQL Server 2017 で実装が行われる実行プランの退行を自動検知してのプランの強制については未実装ということになっています。
なっていたんですが、次のクエリを SQL Database に実行してみたら、SQL Server 2017 と同じように動作しました。
特にアナウンスとかは行われていないので、最終的にどうなるかは不明ですが…。
-- 初期化 ALTER DATABASE current SET QUERY_STORE CLEAR ALL ALTER DATABASE current SET AUTOMATIC_TUNING ( FORCE_LAST_GOOD_PLAN = OFF) GO -- 設定 ALTER DATABASE CURRENT SET QUERY_STORE = ON GO ALTER DATABASE CURRENT SET QUERY_STORE (OPERATION_MODE = READ_WRITE, INTERVAL_LENGTH_MINUTES = 1) GO ALTER DATABASE CURRENT SET AUTOMATIC_TUNING ( FORCE_LAST_GOOD_PLAN = ON ) GO SELECT * FROM sys.database_automatic_tuning_options GO
「FORCE_LAST_GOOD_PLAN」が SQL Server 2017 のクエリの退行の自動的な補正のチューニングとなるのですが、SQL Dabase の sys.database_automatic_tuning_options でチューニング項目として認識されており、有効化ができました。
(こそっと、見知らぬチューニングの設定項目もあったりしますが)
![]()
「FORCE_LAST_GOOD_PLAN」を有効化しなくても、クエリストアを有効にしていれば、推奨情報については取得されますので、次のクエリを実行すると、「Active」となっている情報が取得できるかもしれません。
SELECT
r.reason,
score,
JSON_VALUE(details, '$.implementationDetails.script') script,
planState.*,
planForceDetails.*
FROM
sys.dm_db_tuning_recommendations r
CROSS APPLY OPENJSON (Details, '$.planForceDetails')
WITH (
[query_id] int '$.queryId',
[new plan_id] int '$.regressedPlanId',
[recommended plan_id] int '$.forcedPlanId'
) as planForceDetails
CROSS APPLY OPENJSON (state)
WITH
(
[currentValue] nvarchar(100) '$.currentValue',
[reason] nvarchar(100) '$.reason'
) as planState
GO
![]()
「Active」となっている推奨については、自動チューニングが有効になっていないため、自動的に実行プランの強制は実行されていないが、退行したクエリの情報となりますので、この情報もチューニングに生かすことができるかと。
SQL Server 2017 の場合、自動チューニングは Enterprise Edition の機能となるのですが、SQL Database では、現時点では Basic でも動作したので、このまま実装されるとうれしいですね。
[…] SQL Database で SQL Server 2017 の自動チューニングが使えるかもしれない […]
Azure Update (2017.08.31) | ブチザッキ
31 8月 17 at 04:21