Blog ブログ

クエリストアでパフォーマンス監視

お久しぶりです、今回は新里です。

 「クエリストアでのパフォーマンス監視」についてお話しさせて頂きたく思います。
興味のある方はどうぞ宜しくお願いします。

 クエリストアとは、クエリの実行履歴を保存してくれる機能で、SQL Server 2016 から使用可能となりました。
ですが、実は Azure SQL Database では2015年の11月から使用可能だったんですね。
 Azure SQL Database は SQL Server エンジンを使用したデータベースをクラウド上で Azure が管理してくれるサービスです。
これらは Visual Studio や SQL Server Management Studio から容易にアクセス出来、Windows で効率的に開発を行うことが出来ます。

 このクエリストアを活用して必要な情報を取得し、
パフォーマンスに関する問題点をいち早く確認する事が出来ます。

まず、Azure SQL Database では Portal サイトからパフォーマンスを確認する機能が存在します。

・Azure Portal
 Azure Portal はブラウザからアクセス出来、Azure上のサービス環境構築を管理する事が出来ます。(クラシック版では無い前提で進めさせていただきます)

 SQL Database の追加、削除が容易に出来、パフォーマンス監視もやってくれます。
SQL Database の概要ページへ遷移すれば、CPU使用率、DTU割合、データIOの割合、データベースサイズの割合などを監視することが出来ます。

 グラフを編集する事で監視したい項目をカスタマイズする事も可能です。
また、アラートメールの設定も行えるので、急激な負荷に対する警戒も行えます。

 ー パフォーマンス推奨事項
 効果の見込めるチューニング内容を提示してくれます。
インデックスの付け方についても効果が見込めるものを提示してくれたりします。

 ー SQL Database Performance Insight
 CPU消費量上位のものや実行時間の長いクエリの情報を集計してくれます。

クエリストア
 冒頭でもお話しましたが、クエリストアとは、クエリに関連するコンパイルやランタイムの情報を収集する機能で、Azure SQL Database ではデフォルトでクエリストアが有効になっており、SQL Server 2016 以降であれば Azure で無くてもクエリストアを利用することが出来ます。
 
 設定が OFF になっていたり、設定によっては思った様に機能しない場合があるので設定値を確認してみましょう。
もし、OFF になっているならば有効設定に変更しましょう。
SQL Server Management Studio ならばデータベースのプロパティから容易に設定を変更できます。

 クエリで設定値を更新することも可能です。

 クエリストアに関する設定値を確認したい場合は以下のクエリで取得できます。

クエリストアの領域を拡張する事も出来ます。
クエリの量によっては足りない場合もあり得るので確認しておきましょう。
その他にも設定可能な項目があり、確認したい環境に適した設定に変更できます。

 この様にローカル環境でクエリストアを有効にしておけば開発中のテストの結果から、実装内容の評価を行う事が出来ます。
 実装内容が小規模である場合や実行頻度が低いものであったりすると事前に問題が検知できず、後々になって発覚する場合があるので、ローカル環境で自身の対応内容のみを確認する事が出来ます。

 内容やタイミングによってはそこまで細かく見ておく必要が無い場合があったり、そもそも無駄だったりするので、そこは内容と時間と優先度に相談するとしましょう。

SQL Server Management Studio
 クエリストアを有効にして、クエリをシナリオにそって1日ほど実行すればクエリストアに情報が蓄積されます。
 
 これらの情報を閲覧する方法は SQL Server Management Studio でも可能です。
クエリストアが有効な状態であれば、テーブルの階層に「Query Store」階層が生成されます。

 - Regressed Queries
 特定の期間中にパフォーマンスの低下したクエリを集計してくれます。
インデックスの変更やこれまで実行されていなかったもの等、以前よりパフォーマンスが低下したもの等の特定に役立ちます。

 - Overall Resource Consumption
 CPU時間、実行時間、実行回数等の値大きい日をグラフで示してくれます。
問題のある日を容易に特定することが出来ます。

 - Top Resource Consuming Queries
 CPU時間、実行時間、実行回数などが多いクエリデータを降順で集計してくれます。

クエリプランが変更されると、前回のプランと比較することも出来ます。
何故プランが変更されたのかや、インデックスが有効に働いているかどうかを比較して確認することが出来ます。

あ、インデックスの使われ方変わってる。。。

 - Tracked Queries
 query id を指定して特定のクエリを指定してクエリ実行時間の遷移を確認出来ます。
問題のあるクエリを特定した後により詳細を追いかけるのに役立ちます。

あ、何か警告出とる。。。

 チームで開発している場合、メンバーが実装した機能が集められる統合環境が存在すると思います。
その環境のクエリストアの内容を確認すれば、統合された環境でどういった結果になるかが確認出来、ローカル環境では分からなかった他の機能との影響が分かります。
 
 異常な実行時間を検知した場合にアラートを出すなんてものがあると良いかもしれませんね。

Power BI
 Power BI とは Microsoft が提供する分析ツールの事です。
クエリストアに対して欲しいデータを取得する様なクエリを書いてしまえば、Viewをカスタマイズすることで視覚化する事が可能です。
 
 クエリストアがどの様な値を保持しているかは、SQL Server Management Studio から確認することが出来ます。

 ここから試しに以下の様なクエリで、データを取得してみましょう。

 PowerBIを起動して、「データを取得」を選択します。

 確認したいDBの情報を入力し、先ほどのクエリを「SQL ステートメント」項目に記述します。
 正常に動作すれば、クエリ1という項目が追加されるので、グラフに反映させたい項目を設定してViewerに表示します。
実行回数TOP10の実行時間円グラフの図

 これで最も呼び出されているクエリの中で、実行時間が一番大きいクエリがわかりますね。(需要があるかどうかはおいて置いて。。。)
 
 この様に、確認したい項目を自身でカスタマイズする事が出来ます。
今回のものは簡単な実行例になりますが、可視化することで何が問題であるかがすぐわかる様になります。

 リリース前の段階であれば負荷試験を実施すると思います。
その際に取得できる情報は膨大になるので、
事前に必要となる項目を洗い出し可視化する事でより鮮明な問題点を確認できます。
 
 ユーザの動きを想定したシナリオ用意し、このシナリオの内容が本来のユーザの動きと一致していればいるほど、リリース前の確認が正確なものとなり、リリース後の想定外の問題を減らす事が出来るでしょう。

 如何でしたでしょうか。
問題となっている箇所はもちろん、確認したい粒度で監視する事も出来るので、開発中や運営中でも事前に問題を検知できますね。

 それでは今回は、この辺で失礼致します。
ありがとうございました。


採用情報

クラウドクリエイティブスタジオでは絶賛エンジニア募集中です。
ご興味のある方は是非!

採用情報