【SQLServer】インデックス再構築では自動生成された統計情報は更新されない
以下を参考にSQLServerのチューニングを実施したが、その際の気づきを残しておく。
インデックス再構築によって更新される統計は、更新対象インデックスの統計であって、それ以外の統計 (更新対象ではないインデックスや列の統計) は更新されません。
とあるが、自動生成された統計情報は更新対象ではない。
インデックスを作成した列に対しては統計情報が一つ自動で作成されるが、それ以外の列にも自動生成されることがある*1。AUTO_CREATE_STATISTICSがONのデータベースでは、以下の通り統計情報の自動生成が行われうる*2:
例えば、WHERE B=xxx という検索を行なったときに、B 列にインデックスが 作成されていない場合は、_WA_Sys_B_XXX という統計が作成されます。 この統計は、使われなくなった場合には、自動的に削除されるのでほっておいても 問題ありません。明示的に削除したい場合は DROP STATISTICS を使います。
なお、自動生成された場合は必ず単一列を対象とした統計情報となる*3。
すなわち、一つのヒープに対して複数のインデックスが存在でき、それぞれに統計情報が一つ対応して存在するが、それ以外にも自動生成された統計情報が存在しうる。インデックス再構築の際にサンプル率100%で更新される統計情報は前者のみで、後者は対象外となる*4。
余談だが、統計情報の更新をサンプル率100%で定期的に実施するのであれば、その更新頻度次第では、既定のサンプリングレートで更新されてしまう自動更新による統計情報の劣化を防ぐため、AUTO_UPDATE_STATISTICS オプションをオフにしておくのを忘れないように気をつけたい。
*1:
SQL Server の統計情報作成について書いてみた、ちょっとだけマジメにまとめてみた - 都内で働くSEの技術的なひとりごと
*2:
「【統計情報】_WA_SYS_XXXについて」(1) Database Expert − @IT
*3:
統計 | Microsoft Docs | Microsoft Docs
*4:ALTER INDEX において対象のインデックスを個別に指定せずALLとし再構築しても同様である。
TCPコネクションにおけるハーフオープンとは
2ホスト間でTCPコネクションを確立する際、3wayハンドシェイクと呼ばれる以下のようなTCPパケットのやりとりを行う。
①クライアントがサーバへSYNパケットを送信
②サーバがSYN+ACNパケットを返信
③クライアントがACNパケットを送信
クライアントが②の後③を行わなければ、サーバはACNの待機をタイムアウトまで続ける。この確立しないTCPコネクションの状態のことをハーフオープンと呼ぶ。
ハーフオープンのコネクションが存在すると、サーバはタイムアウトまでACNパケット受信待ちを行うため、一定量のリソースを消費する。
このことを利用し、クライアントからサーバへ大量のハーフオープンのコネクションを意図的に行い、サーバのリソースを消費する攻撃をTCP SYNフラッド攻撃(または単にSYNフラッド攻撃)と呼ぶ。
参考
【SQLServer】2008R2 のSQL Server AuditにおいてApplication Nameは取得できるか
不可能。
SQLServer2017より可能となった。
SQLServerの監査ログ出力機能にはSQL Server Audit と Profiler(Trace)の2つがある。
SQL Server Auditで出力した監査ログの参照方法は、SSMS上のGUI操作*1とfn_get_audit_file システム関数*2があるが、fn_get_audit_fileでapplication_nameが取得できるようになるのはSQLServer 2017から*3。
なお、client_ipについてはサーバ監査ログファイルからfn_get_audit_fileで取得したテーブル内の、additional_information列にxml情報として埋め込まれている。
参考
SQL Server Audit と Profiler(Trace) のパフォーマンス差のメモ - お だ のスペース
プロファイラ vs. SQL Server Audit(SQL Server 監査) - 松本崇博 Blog (SQL Server Tips)