都内で働くSEの技術的なひとりごと / Technical soliloquy of System Engineer working in Tokyo

都内でサラリーマンやってます。SQL Server を中心とした (2023年からは Azure も。) マイクロソフト系(たまに、OSS系などマイクロソフト以外の技術も...)の技術的なことについて書いています。日々の仕事の中で、気になったことを技術要素関係なく気まぐれに選んでいるので記事内容は開発言語、インフラ等ばらばらです。なお、当ブログで発信、発言は私個人のものであり、所属する組織、企業、団体等とは何のかかわりもございません。ブログの内容もきちんと検証して使用してください。英語の勉強のため、英語の

何か便利だと思うことやれば、何か不都合なことおきるよね...と思って記事書いてみた

 本日は諸事情により、会社をお休みしております。少し時間があるので、どうしたもんかなと思ったことを綴りたいと思います。下図は、ある環境でパラメータ化強制した場合としていない場合の実行プランの内容です。パラメータ化強制した場合、推定行数が実際の行数と大きく乖離しているのがわかるかと思います。

  • パラメータ化:強制(PARAMETERIZATION FORCED)
    f:id:koogucc11:20151116161537p:plain
    推定行数と実際の行数が大きく乖離しています。
  • パラメータ化:単純(PARAMETERIZATION SIMPLE)
    f:id:koogucc11:20151116161558p:plain
    推定行数と実際の行数の乖離がありません。

 パラメータ化強制した場合、統計情報のヒストグラムを参照していないようですね。データベース全体をパラメータ化強制している状態で、このような現象が発生した場合どうしたらよいか?プランガイドになっちゃうんですかね。プランガイドは下記のようなスクリプトで対応することができます。PARAMETERIZATION を SIMPLE に指定しています。

DECLARE @stmt   NVARCHAR(MAX)
DECLARE @params NVARCHAR(MAX)

EXEC sp_get_query_template 
     N'<SQL Statement を指定>',
     @stmt OUTPUT, 
     @params OUTPUT;
EXEC sp_create_plan_guide 
     N'TemplateGuide1', 
     @stmt, 
     N'TEMPLATE', 
     NULL, 
     @params, 
     N'OPTION(PARAMETERIZATION SIMPLE)';

 けど、業務アプリケーションのクエリにプランガイドを適用するって....Where句の条件に数十パターンとか存在する場合、保守するの大変ですね。うーん、どうしたものか。過去にプランガイドに触れてましたね。ryuchan.hatenablog.com
ryuchan.hatenablog.com

※勉強会向けに買っておこう。カスタマーレビューを見ると、Lenovoとの相性がよさそうだった。amazon ポイント使って、1,300円くらい。

※少し前に買ってみた。立ってプレゼンするには便利ですね。