SQL Server 2022 PSP 最適化の
ご紹介
第12回 関西DB勉強会
2023/01/21 @shinsukeoda
SQL Server 2022
GA してます
色んな機能が追加/強化されています
今日は PSP 最適化について取り上げます
Parameter Sensitive Plan optimization -
SQL Server | Microsoft Learn
PSP(Parameter Sensitive Plan)
SQL Server はクエリプランをキャッシュする
初回実行のクエリはコンパイル結果をクエリプランキャッシュとして保持
初回実行時のパラメータ値によって、クエリプランが変わることがある
クエリ実行時にクエリプランのキャッシュが
ある時:キャッシュされたプランで、今回のパラメータ値を渡して実行
ない時:↑で書いたように今回のパラメータ値でコンパイル、出来たプラン
をキャッシュ (当然作ったプラン/今回のパラメータで実行)
初回のパラメータが多く利用するパラメータ値では無かったら?
あまり使われないパラメータ値に最適なクエリプランをキャッシュ
多く利用するパラメータ値で最適なクエリプランとは限らない
PSP 問題=> パラメータに依存するプランの問題!!!!
同一/異なるクエリプランになる例
同一の例
exec sp_executesql N'select * from [Tbl] where [Id] = @p1', N'@p1 int’, 1
exec sp_executesql N'select * from [Tbl] where [Id] = @p1', N'@p1 int’, 2
※パラメータの値が違う(1 と 2) が、同じプランで実行される
異なる例
exec sp_executesql N'select * from [Tbl] where [Id] = @p1', N'@p1 int’, 1
exec sp_executesql N'select * from [Tbl] where [Id] = @p2', N’@p2 int’, 1
※パラメータの値が同じだが、パラメータ名が違うので異なるプランになる
雑な例
インデックス列が条件で
1件しかマッチしないパラメータ値の場合 => index seek
全体の8割がマッチするパラメータ値の場合 => table scan
初回が8割マッチの値、直後に1件マッチの値で実行されると…
初回:キャッシュにないので、8割マッチの値でプラン作成 => table scan
直後:キャッシュにプランがあるので、そのプランで1件マッチの値で実行
=> table scan
1件マッチの値なので、index seek になって欲しい…
別の名前で呼ばれてなかった?
パラメータスニッフィング (Parameter Sniffing)
プランの後退 (Plan regression)
よくある対処方法は?
キャッシュされている該当のプランをキャッシュから削除する
再度コンパイルされるように
クエリにリコンパイルオプションを設定する
常にコンパイルされるように
クエリストアから最適なプランに戻す
クエリストアに最適なプランがあるなら
自動チューニング
プランの自動修正
PSP 最適化
パラメーターに依存するプランの最適化 - SQL Server | Microsoft
Learn
プランを幾つか用意してデータの分布によって使い分けたら良いん
じゃね?
低、中、高 で最大3つの実行プランが作られ、実行時パラメータによって、
Dispatcher が最適なプランを使うように振り分ける
https://learn.microsoft.com/ja-jp/sql/relational-
databases/performance/media/parameter-sensitivity-plan-
optimization/parameter-sensitive-plan-boundaries.png?view=sql-server-ver16

SQL Server2022_PSPoptimization_pub.pdf

  • 1.
    SQL Server 2022PSP 最適化の ご紹介 第12回 関西DB勉強会 2023/01/21 @shinsukeoda
  • 2.
    SQL Server 2022 GAしてます 色んな機能が追加/強化されています 今日は PSP 最適化について取り上げます Parameter Sensitive Plan optimization - SQL Server | Microsoft Learn
  • 3.
    PSP(Parameter Sensitive Plan) SQLServer はクエリプランをキャッシュする 初回実行のクエリはコンパイル結果をクエリプランキャッシュとして保持 初回実行時のパラメータ値によって、クエリプランが変わることがある クエリ実行時にクエリプランのキャッシュが ある時:キャッシュされたプランで、今回のパラメータ値を渡して実行 ない時:↑で書いたように今回のパラメータ値でコンパイル、出来たプラン をキャッシュ (当然作ったプラン/今回のパラメータで実行) 初回のパラメータが多く利用するパラメータ値では無かったら? あまり使われないパラメータ値に最適なクエリプランをキャッシュ 多く利用するパラメータ値で最適なクエリプランとは限らない PSP 問題=> パラメータに依存するプランの問題!!!!
  • 4.
    同一/異なるクエリプランになる例 同一の例 exec sp_executesql N'select* from [Tbl] where [Id] = @p1', N'@p1 int’, 1 exec sp_executesql N'select * from [Tbl] where [Id] = @p1', N'@p1 int’, 2 ※パラメータの値が違う(1 と 2) が、同じプランで実行される 異なる例 exec sp_executesql N'select * from [Tbl] where [Id] = @p1', N'@p1 int’, 1 exec sp_executesql N'select * from [Tbl] where [Id] = @p2', N’@p2 int’, 1 ※パラメータの値が同じだが、パラメータ名が違うので異なるプランになる
  • 5.
    雑な例 インデックス列が条件で 1件しかマッチしないパラメータ値の場合 => indexseek 全体の8割がマッチするパラメータ値の場合 => table scan 初回が8割マッチの値、直後に1件マッチの値で実行されると… 初回:キャッシュにないので、8割マッチの値でプラン作成 => table scan 直後:キャッシュにプランがあるので、そのプランで1件マッチの値で実行 => table scan 1件マッチの値なので、index seek になって欲しい…
  • 6.
    別の名前で呼ばれてなかった? パラメータスニッフィング (Parameter Sniffing) プランの後退(Plan regression) よくある対処方法は? キャッシュされている該当のプランをキャッシュから削除する 再度コンパイルされるように クエリにリコンパイルオプションを設定する 常にコンパイルされるように クエリストアから最適なプランに戻す クエリストアに最適なプランがあるなら 自動チューニング プランの自動修正
  • 7.
    PSP 最適化 パラメーターに依存するプランの最適化 -SQL Server | Microsoft Learn プランを幾つか用意してデータの分布によって使い分けたら良いん じゃね? 低、中、高 で最大3つの実行プランが作られ、実行時パラメータによって、 Dispatcher が最適なプランを使うように振り分ける https://learn.microsoft.com/ja-jp/sql/relational- databases/performance/media/parameter-sensitivity-plan- optimization/parameter-sensitive-plan-boundaries.png?view=sql-server-ver16