ニュース&ブログ
【SQL Server】クエリストアでクエリチューニングを効率化させよう(基本編)
投稿日:2024/05/10
はじめに
最近はSQL Serverのパフォーマンスチューニングに関する依頼を受ける機会が増えており、特にデータベースの応答速度の低下やクエリの実行時間の増加に悩むお客様からの相談が多いです。
これらの問題を解決するために、さまざまなツールや技術が存在し、前回は拡張イベントに関するブログもアップしています。
今回はSQL Serverのクエリストアに焦点を当て、皆さんに情報を共有できればと思います。
クエリストアとは
SQL Server 2016から実装されたデータベースごとに有効化することができる機能であり、パフォーマンスのトラブルシューティングとクエリのチューニングを簡単にするため、実行したクエリや実行計画、クエリの情報履歴を自動的に記録します。
この機能により、実行計画の変更によって生じるパフォーマンスの違いを素早く確認することができます。
また、クエリストアによって記録されたプランを使って実行計画を強制することもできます。
基本動作
クエリに関するデータ(以下、データと記載)はメモリ内に保存され、非同期でデータファイルに書き込まれます。
メモリ内でデータを保持する期間は DATA_FLUSH_INTERVAL_SECONDS オプションで定義された期間となりますが、推奨は既定値の 900 秒 (15 分)となっています。
過去のデータはデータベースファイル(PRIMARYファイルグループのファイルが既定)に蓄積されます。
ただし、MAX_STORAGE_SIZE_MB オプションで定義されているサイズ(既定値は1000MB)以上には肥大化しません。
クエリストア内のデータには保持日数も定義することが可能であり、既定ではCLEANUP_POLICY = (STALE_QUERY_THRESHOLD_DAYS = 30) となっています。
保持日数を過ぎたデータはデータファイル内から削除されます。
以下、基本動作のイメージ図となります。
クエリストアを有効化していない環境に対して導入する際、クエリストアによる負荷が心配といった不安な声を聞くこともあります。
しかし、上述の通り、可能な限り既存のワークロードに負荷をかけない設計がされており、更にクエリストアの処理は非同期で行われるため、秒間数万のアドホッククエリが実行されるようなワークロードでなければ、クエリストアの有効化による性能影響は発生しないと考えられます。
使用される想定シナリオ
クエリストアでは、データベースで実行された操作のパフォーマンスに関する析情報が提供されます。
MS公式ドキュメントが示している一般的なシナリオは以下です。
1.不適切なクエリ実行プランの選択によるパフォーマンスの低下を特定して修正する2.リソース消費量の最も多いクエリを特定してチューニングする
3.データベースとアプリケーションの変更の影響を評価するために A/B テストを行う
4.SQL Server をアップグレードした後でパフォーマンスを安定させる
5.最も頻繁に使われるクエリを特定する
6.クエリのクエリ プランの履歴を監査する
7.アドホックなワークロードの識別と改善
8.データベースの一般的な待機カテゴリと、待機時間に影響を与えているクエリとプランを把握する
9.リソース消費量 (CPU、I/O、メモリ) に適用される経時的なデータベース使用パターンを分析する
特に1.2で利用されることが多い印象があります。
4.についてもアップグレードや移行後のパフォーマンス状況を確認するためにも利用できそうです。
まとめ
SQL Serverのクエリストアについて、概要から具体的な使用シナリオまで説明致しました。
なお、クエリストアはSQL Server 2022からはデフォルトで有効化されています。
そのため、クエリストアによるワークロードに与える負荷は問題になっていることは低く、安定稼働しているからこそ、デフォルトで有効化されるようになったのかもしれませんね。
次回は実際にSSMSからクエリストアの使用デモとして、応用編のブログをアップする予定です。
参考公式Doc
クエリ ストアを使用してパフォーマンスを監視する
クエリ ストアを使用してワークロードを監視するためのベスト プラクティス
クエリ ストアでデータを収集する方法
クエリ ストアでの最適化されたプラン強制
クエリ ストアの使用シナリオ
問題のあるクエリ プランを識別する
中川 智文(2022年入社)
株式会社システムサポート フューチャーイノベーション事業本部 ソリューションサービス事業部所属
Oracle Database, SQL Serverを中心とした案件に従事