SQL Server2016 新機能クエリストア

2017/2/13

わーすーです。

SQL Server 2016がリリースされて半年が経ちました。
新機能は試してみましたでしょうか。今回はあまり知られていない機能「クエリストア」についてご紹介します。

クエリストアを利用するとSQLの実行計画を保存することができます。
これによって「昨日までは問題なかったのに、何故か急に遅くなった」、「遅くなった理由が分からない」といった悩みを解決できる可能性があります。

これまでのバージョンではquery_statsというシステム管理ビューを参照すればSQLの実行計画を確認することができました。しかしこれはSQL Serverを再起動したり、プロシージャキャッシュのサイズが圧迫されると消えてしまい参照できなくなってしまいます。クエリストアを使うことで再起動しても過去に振り返って調査が可能です。

それでは試してみます。
事前にデータベースのクエリストアの設定を有効にします。

対象データベースを右クリック、[プロパティ]を開き、クエリストアを選びます。

querystore1.png

一番下の操作モード(要求)を「オフ」から「読み取り、書き込み」にします。
これで設定は完了です。

querystore2.png

早速クエリストアの画面を見てみましょう。
[データベース名]→[クエリストア]→[リソースを消費したクエリ]の順に展開します。

querystore3.png

まず確認できるのが、一番合計実行時間が長かったSQLです。
右画面のプランの実行概要を確認すると実行計画の数を表すプランIDは1つであることが確認できます。

querystore4.png

今度は二番目に合計実行時間が長い棒グラフをクリックします。

querystore5.png

今度はプランIDが2つ存在し、同じSQLが2つの実行計画で実行されたのが確認できます。
(この2回の実行の間にはSQL Serverの再起動をしています。)

querystore6.png

※縦軸は合計実行時間、横軸は実行時刻

それぞれのプランを見てみましょう。
まずはプランID28(紫)です。

querystore7.png

続いてプランID35(紺)です。
図の紺の〇をクリックして確認します。
プラン28がIndex Seek (ピンポイント検索)なのに対してプラン35はClustered Index Scan(全スキャン)です。
最初のグラフからもわかるようにこっちの実行計画の方が速いです。

querystore8.png

さらにクエリストアは複数の実行計画が表示される場合は、どちらかの実行計画で必ず実行されるように、
プランを強制することができます。
プランを固定する場合、プラン35を選択して「プランの強制」をクリックするだけです。
これでこのSQLを実行した場合は必ず Clustered Index Scan で実行されるようになります。

querystore9.png

一番基本的な機能だけを紹介しましたが、このように全体のリソース消費を確認したりすることも可能です。

querystore10.png

表示方法をカスタマイズしたり、詳細のデータも表示させることができるのでぜひ試してみてください。
なによりもStandardエディションでも使用が可能です。知っていた方がお得です。

Standby Expressに関するお問合わせ

  • TEL 042-333-6217
  • FAX 042-352-6101
  • LINE
  • Mail