Nexta Tech Blog
💽

SQL Server パフォーマンス改善!統計情報の更新&自動化

に公開

株式会社ネクスタの奥上です。

はじめに

弊社では自社プロダクト「SmartF」の開発を行っており、その前身の時代からデータベースにはSQLServerを採用しています。
小規模な利用の場合はパフォーマンスに問題が出ることが少なかったですが、データや機能が増えたときに、ある日突然遅くなったなどのパフォーマンスが課題となった過去があります。1つの理由として統計情報が古いことが原因だったことがあり、その解消方法について共有します。

効果としては、例えばデータ検索時に30秒以上掛かっていたものが、数秒でレスポンスできるなどの効果が出ました。

SQL Serverのパフォーマンス問題と対策の概要

よくパフォーマンスを改善する場合、インデックスの見直し、クエリのチューニング、などを実施されるケースが多く、弊社でも日々改善対応を行っています。
それ以外にもメンテナンス機能を利用することでパフォーマンスが改善することがあり、統計情報の更新はそれにあたります。

統計情報について

データベース内のデータを適当に検索すると非効率なため、データベースには効率的に検索できる機能が実装されており、それに利用されるデータが統計情報になります。
統計情報は生成したタイミングのデータにとって最適に構成されますので、データが大きく変わったときは最適なものではなくなってることがあります。
そのため、必要なタイミングで統計情報の更新をする必要が出てきます。

例えば、データベース内の地図のようなイメージです。
時間が経つと街並みも変わって、地図が古くなったことで、迷子になってしまう可能性が出てきます。
それを最新にすることで、より的確に効率的に目的地まで到達することが可能になります。

・データベースのすべての統計情報を更新する方法

EXEC sp_updatestats;

・テーブルの統計情報を更新する方法

UPDATE STATISTICS <テーブル名>;

実際の例

キャプチャの1行目は、統計情報の更新前、2行目が更新後の例になります。
論理読み取り回数 (Logical Reads)が約1/10になっています。
オプティマイザはインデックスを効率的に利用できず、不必要なテーブルスキャンやインデックススキャンを実行してる可能性があります。

弊社の検証用の環境で、実際のユーザ環境の値ではありません

統計情報がパフォーマンス低下を起こす状況

・データ量
 データ量が多いと差が出やすいです
・偏り
 データの偏りがあると、オプティマイザの推測が誤るケースがあります
・複雑性
 クエリが複雑であればあるほど、統計情報の影響を受けやすくなります

SQL Serverでの自動メンテナンス

SQL Serverにはメンテナンス機能で統計情報の更新を自動で実行できる機能が用意されています。
メンテナンスプランを右クリックして、ウィザードから設定することが可能です。


オブジェクトエクスプローラ→管理→メンテナンスプランの設定画面

注意事項

※「sp_updatestats」はサンプリングレート(統計情報の対象となるデータの割合)がデフォルトもしくは前回実行した値となります。「UPDATE STATISTICS」は細かく指定が可能ですので、必要に応じて使い分けてください。
(ざっくり使ってみたい場合は前者、細かく調整したい場合は後者を使うとよいかと思います。)

サンプリングレートとは、統計情報を収集する際にテーブル全体をスキャンするのではなく、一部のデータのみを抽出して統計情報を生成する割合のことです。
高いほど処理に時間が掛かりますが精度が上がります。低いと処理は速いですが精度が落ちる可能性があります。

実行頻度について

サービスの特性によって、必要なタイミングでの実施を検討する必要があるかと思います。
弊社ではユーザさまのご利用状況を踏まえまして、最低でも1日に1度は統計情報の更新の判断をしています。

追加で対策できること

今回、スケジューラにより特定の日時にメンテナンス機能を実施するようにしました。
ただ、ユーザの利用方法によってはそれでは不十分な場合が出てきます。
大量のデータ更新が行われたときに自動で実施するようにすれば、その問題についても解消できるようになります。

AIの活用

今までは自身で各種情報から分析して見立てを立てて試行していました。
最近ではAI(GeminiやClaudeなど)を活用することで、比較的簡単に原因分析がしやすくなりました。

・症状
・発生日時
・実行プランのXMLを添付(実際の実行プランを含めるを有効にして検索し、実行プランのXMLを表示、した内容を添付)
・問題発生前後の待機統計情報(sys.dm_os_wait_stats)の検索結果(累積値のため前後の値が必要)
・サーバ構成
・バージョン情報
を共有することで、より的確なアドバイスを得ることができます。

参考資料

https://learn.microsoft.com/ja-jp/sql/relational-databases/statistics/update-statistics?view=sql-server-ver17

Nexta Tech Blog
Nexta Tech Blog

Discussion