SQL Server 2022 CU26 では、次の修正が含まれています。
本問題ではどのような挙動が修正されたのかをまとめておきたいと思います。
なお、この修正については、SQL Server 2022 CU26 以降 / SQL Server 2025 CU3 以降で対応されていることは確認をしています。
SQL Server 2025 は手元にあったのが CU3 までなので、それより前のバージョンでは確認をしていませんが、前のバージョンに修正が含まれている可能性もあります。
SQL Server 2014 から内在しているはずの挙動ですが、SQL Server 2019 以前のバージョンについては、メインストリームサポートが終了しているため、本問題の修正が含まれることはないかと思います。
増分統計で発生していた問題
SQL Server では 増分統計 (Incremental Statistics) という機能があります。
これは、SQL Server 2014 から実装された機能となり、パーティション単位で統計情報を保持することで、パーティション化されたテーブルの統計情報のメンテナンスを効率的に実施するというものです。
この機能を使用している場合で次のケースに当てはまる場合は、今回の事象が発生します。
- 統計情報の手動による明示的な更新を実施しておらず、初期の 100% のサンプリングで統計情報が取得されている。
- この状態で統計情報の自動更新が発生する。
このようなテーブルで上記の条件を満たしている場合「統計情報の自動更新が発生した場合、毎回 100% のサンプリングで統計の更新が行われる」というような挙動が発生します。
増分統計はパーティション化されたテーブルで使用するものとなり、パーティション化されたテーブルではデータ件数が多い傾向があるかと思いますが、このような挙動となってしまうことで、統計情報の自動更新が発生した場合委のオーバーヘッドが高くなるという事象が発生します。
問題が発生した場合の挙動
統計情報の自動更新については、次のような拡張イベントで状況を確認することができます。
- 統計情報の自動更新: auto_stats
- 増分統計のサンプリングの変更: incremental_stats_sampling_change
これらのイベントを取得することで、統計情報の自動更新の発生状況と、増分統計で更新が発生した場合に、サンプリングをどの程度に指定したかを把握することができます。
問題が発生している環境では、次のような情報となります。
統計情報の増分統計のサンプリングが 100% から、 22% に変更しようとしているのですが、この値が統計情報の自動更新の処理には引き継がれておらず、毎回 100% のサンプリングで統計情報の自動更新が発生しているという状態となります。
100% のサンプリングということはパーティション化されたテーブルに対してフルスキャンをしていることになるため、統計情報の自動更新が発生した際のオーバーヘッドが高くなるという状態となってしまいます。
修正が含まれていない SQL Server で対応をする場合
上述のとおり、SQL Server 2022 CU26 以降であれば、この問題に対しての修正が含まれているため、既定の挙動を変更する術が提供されているのですが、それより前の SQL Server では設定で修正が含まれていません。
そのため、修正が含まれていないバージョンの SQL Server では次の対応を検討する必要があります。
- 統計情報を一度、手動で明示的に更新を行う
例としては次のようなクエリを実行します。
UPDATE STATISTICS LINEITEM(CIX_LINEITEM) WITH INCREMENTAL=ON
これにより、統計情報が手動で更新され、以降の増分統計の更新では 100% 以外のサンプリングレートが使用されて統計情報の自動更新が行われるようになります。
問題が発生する原因
なぜ、上記の対応 (手動で統計情報を明示的に更新) をすることで、事象が解決するかですが、これは増分統計の自動更新のロジックの問題に起因しています。
前述のとおり増分統計の自動更新の発生時にはサンプリングレートが算出されているのですが更新に使用されていないため常に 100% で統計情報の自動更新が発生するケースがあります。
SQL Server では統計情報の自動更新が発生した場合、少量データのテーブル (1,024 ページ未満 / 8MB) であれば、フルスキャンを使用してデータの取得が行われています。
そのため、増分統計が設定されたパーティション化されたテーブルでも最初は 100% のサンプリングで統計情報が作成された状態となります。
修正が含まれていない SQL Server では、増分統計の統計情報の自動更新は次のような動作となっていました。
- サンプリングレートが固定化されておらず 100% のサンプリングで統計情報が更新されている場合、次回の統計情報の更新についても 100% のサンプリングで統計情報の自動更新が行われる
そのため、初回に 100% のサンプリングで増分統計の統計情報の自動更新が行われている場合、100% のサンプリングが以降の自動更新でも引き継がれてしまい、毎回フルスキャンが行われてしまうという挙動となっていました。
統計情報を手動で更新することで 100% のサンプリングではなくなるため、以降の増分統計の自動更新については自動的なサンプリングレートが使用され、フルスキャンによる統計情報を作成するためのデータ取得を抑制することが可能となります。
修正が含まれている SQL Server で対応をする場合
SQL Server 2025 (私が確認したのは CU3 以降) では、この問題に対しての修正が含まれているようで、特に対応をしなくても、増分統計の自動更新時のサンプリングは期待した挙動となっているようでした。
SQL Server 2022 CU26 では本問題の修正が含まれていますが、これは自動で適用はされません。次のいずれかの対応を実施することで本問題の対応が行われた挙動となります。
- ALTER DATABASE SCOPED CONFIGURATION SET QUERY_OPTIMIZER_HOTFIXES = ON;
- DBCC TRACEON (4199, -1);
SQL Server 2022 CU26 では、この修正は、クエリオプティマイザの修正プログラムの実装として含まれているようで、DB レベルの設定または、TF を有効にしてクエリオプティマイザの修正を適用する必要があるようです。
いずれかの対応を実施することで、統計情報を明示的に更新しておらず 100% のサンプリングとなっている場合でも、動的なサンプリングが行われ 100% の固定が解除される挙動となります。
本問題のみを個別に適用するための設定は提供されていないようで、インスタンスまたは DB レベルでクエリオプティマイザの修正プログラムの適用を行う必要があり、DB 全体のクエリ実行の挙動に影響を与える可能性があることが注意事項として挙げられます。
SQL Server 2022 CU26 以降でも統計情報の手動の更新によるサンプリングを 100% 以外にする方法は有効ですので、設定を変更できない場合は一度手動で更新をしてサンプリングを変更してみるとよいかと。
本挙動は「増分統計を使用しており、統計情報を手動で更新しておらず 100% のサンプリング使用されている」場合に発生する可能性のある事象となります。
- 統計情報を手動で明示的に更新し 100% のサンプリングではない状態とする (SQL Server 全バージョン共通)
- SQL Server 2022 CU26 を使用し、DB レベル or インスタンスレベルでクエリオプティマイザの修正を適用
- SQL Server 2025 を使用
のいずれかの対応を実施することで増分統計の自動更新が発生した場合のオーバーヘッドを緩和させることができます。
「1.」の方法が汎用的かもしれませんね。