Azure SQLDatabaseの推奨事項に自動パラメータ化を強化すべしと出てくることがある。
このチューニングを適用するかどうかの考慮材料として、他のDBではONにしてるんでしたっけということを確認したい。
USE [master]
GO
SELECT name
, is_parameterization_forced
FROM sys.databases
GO
is_parameterization_forced
が1ならPARAMETERIZATION
がFORCED
になってる。
そもそもPARAMETERIZATION
が FORCED
だとどうなるのってのはお好きなLLMに聞くよろし。
以下ChatGPTの説明
PARAMETERIZATION FORCED
の効果
自動パラメータ化の強化
SQL Server エンジンは、
WHERE
句やINSERT
文の値など、リテラル値(文字列や数値など)を自動的にパラメータに置き換えます。例えば、
SELECT * FROM Customers WHERE CustomerID = 123
は、自動的に次のようにパラメータ化されます:SELECT * FROM Customers WHERE CustomerID = @p1
これにより、異なるリテラル値を含む同一構造のクエリが、同じ実行プランを再利用できるようになります。
プラン キャッシュの効率向上
多くのクエリが同じ実行プランを使用するため、プラン キャッシュの利用効率が上がります。
毎回新しいリテラル値を含むクエリが発行されても、SQL Server は新しいプランを生成せず、既存のプランを再利用するため、パフォーマンスが向上します。
CPU 負荷の低減
クエリ コンパイルにかかるコストが削減され、CPU 使用率が低くなります。
スケーラビリティの向上
特に高頻度で同じ構造のクエリが実行されるシナリオでは、強制パラメータ化によりシステムのスケーラビリティが向上します。
考慮すべき点
パフォーマンスへの影響(悪影響の可能性)
すべてのクエリに対して強制的に同一のプランが使われるため、一部のクエリでは最適なプランが生成されない場合があります。
例えば、リテラルに応じた最適なインデックスを選ぶ必要がある場合でも、共通のプランが再利用されてしまうことで、パフォーマンスが劣化する可能性があります。
特定のクエリのオプトアウト
OPTION (RECOMPILE)
句を使って、個別のクエリについてはパラメータ化を回避することができます。
複雑なクエリに不向き
FORCED
は簡単なクエリに向いていますが、複雑な結合や動的な条件を含むクエリには向かない場合があります。
使うべき場面
同じ構造のクエリが大量に実行されるシナリオ(例:多くの同一パターンの検索や挿入)。
高いスケーラビリティと安定したパフォーマンスが求められる場合。
クエリ コンパイルのオーバーヘッドを減らしたい場合。
設定方法
以下のクエリで、データベースのパラメータ化設定を FORCED
に変更します:
ALTER DATABASE [YourDatabaseName]
SET PARAMETERIZATION FORCED;
まとめ
PARAMETERIZATION FORCED
は、高頻度なクエリ実行やコンパイルのオーバーヘッドを削減するのに効果的ですが、すべてのシナリオに適しているわけではありません。必要に応じて、特定のクエリに対してパラメータ化をオフにしたり、動的なクエリには適切なインデックスを検討することが重要です。
※ LLMの吐き出した文をそのまま載せるとかいう💩ブログを書いてしまった