"Diary" インターネットさんへの恩返し

いつもソースコードコピペばかりなので,みなさまへ少しばかりの恩返しを

SQL Server 2008(2012)の統計自動更新について:トレースフラグ2371



スポンサーリンク

以下で紹介されていますが、SQL Server2008 SP1以上にて統計の動的閾値を採用した自動更新機能を使用できるようになった。

Changes to automatic update statistics in SQL Server ? traceflag 2371

 

今までは、テーブル統計取得のタイミングは下記の通り、大よそ20%の行更新が閾値になっていた。しかし、テーブルが大きい場合20%に達するまで時間が掛かるため任意のタイミングで適宜更新する必要があった。それを回避するためにトレースフラグ2371をオンにすることで動的閾値を利用した統計更新を実現できる。

 


今までの統計情報の自動更新の基本的なアルゴリズムは、以下のとおりです。

  • テーブルの基数が 6 未満で、そのテーブルが tempdb データベース内に存在する場合は、テーブルが 6 回変更されるたびに自動更新します。
  • テーブルの基数が 6 よりも大きく、500 以下の場合は、500 回変更されるたびに状態を更新します。
  • テーブルの基数が 500 より大きい場合、(500 + テーブルの 20% の) 変更が行われたときに統計を更新します。
  • テーブル変数では、基数を変更しても統計の自動更新のトリガになりません

ご参考:SQL Server の統計保守機能 (Autostats) 

 

以下,新しい動的閾値を採用したMSのテスト結果ですが、テーブル行数が多くなると閾値がほぼ0%に近づいていっています。

 


 

実装して実験してた人もいてこちらもご参考まで。

SQL Server 2008 R2 SP1 で追加された統計情報の自動更新に関してのトレースフラグ

 

実際にトレースをオンにする手順


1.アプリケーション停止(DBの上にのるアプリケーション)

2.SQL Server Conrigration Manager > SQL Server Services > SQL Serverを右クリックして、プロパティを開く。

3.[Startup Parameters]で 「-T 2371」を指定し「Add」。

4.SQL Server再起動。

5.Management Studioから下記のコマンド実行

   DBCC TRACEON(2371)

6.確認。以下のコマンド実行

 DBCC TRACESTATUS(2371)

7.[Status]、[Global]が1になっていることを確認。

 

上記コマンドの説明はこちら

 

1-4をすっ飛ばしても大丈夫ですが、SQL Serverを再起動するとトレースフラグがオフになるので、その点考慮すればOK。

 

注意点は下記の通り、古い実行計画でSQL文が実行されたり、などある。

 

The downside is that updating the statistics results in recompilation of the queries accessing the table. This again can increase the risk of getting a different query plan for the next executions of queries against those tables. On the other side, the dynamic threshold to trigger update statistics should address issues encountered like not finding a new month or new fiscal year for month end reporting in the statistics and hence choosing a sub-optimal plan.

Changes to automatic update statistics in SQL Server ? traceflag 2371

 

 これ勉強になる。

そろそろ中古も出て来ているしかってみるかな