先日、General availability: SQL Database Advisor and Performance dashboard でアナウンスされましたが、SQL Database アドバイザーに、PARAMETERIZE QUERIES recommendations (in preview) という機能が追加されたようなので軽くためしてみました。
Parameterize queries recommendations には、以下のように記載されています。
Parameterize queries recommendations appear when the SQL Database service detects that you have one or more queries that are constantly being recompiled but end up with the same query execution plan. This opens up an opportunity to apply forced parameterization, which will allow query plans to be cached and reused in the future improving performance and reducing resource usage.
同一のクエリが複数回実行され、クエリのコンパイルが発生している場合に、パラメーター化の推奨をアドバイスする機能となっています。
SQL Database アドバイザーは、クエリストアによって取得されたQuery Performance Insight の情報を元に、アドバイスしているんだろうなと思い、アドホックなクエリを複数回実行するようなスクリプトを数日間実行したままにしてみました。
While($true){ $query ="select * FROM TestTable WHERE Col1 = {0} or Col1 = {1}" -f [int]((Get-Random) / 1000000), [int]((Get-Random) / 1000000) 1..30 | %{Invoke-Sqlcmd -ServerInstance "ほげほげ.database.windows.net" ` -Username "ログイン" -Password "パスワード" -Database testdb ` -Query $query > $null} Start-Sleep -Seconds 1 }
これにより、アドバイス情報が提示され、以下のような情報の出力を確認できました。
「スクリプトの表示」をクリックすることで、アドバイスによる設定変更のクエリが表示されます。
これ、DB に対してパラメーターの強制化のオプションを有効にするんですね。
強制パラメータ化
クエリストアでどのようにパラメーター化クエリの推奨アドバイスを実装するのだろうと、疑問に思っていたのですが、特定のクエリに対しての設定ではなく、DB 全体として、アドホックなクエリをパラメーター化にするための設定を変更するというような実装を行うようです。
クエリストアについては、以下の情報が参考になりますので、これらの情報からどのようなクエリの情報が取得できるかを考えてみると、今後アドバイザーに新しい推奨が追加された場合も、取得方法の想像ができそうですね。
クエリのストアを使用した、パフォーマンスの監視
Monitoring Performance By Using the Query Store
Best Practice with the Query Store
Query Store Usage Scenarios