web-dev-qa-db-ja.com

統計の更新をどのくらいの頻度で使用する必要がありますか(より頻繁かそうでないか)。

通常は、Ola Hallengrenのソリューションを使用します。このソリューションは、私たちのインデックス最適化ジョブ内にある統計の更新を処理します。標準的な方法として、すべてのサーバー(1500以上)で毎週日曜日の午前0時に予定されています。

現在、週の半ばに多くのパフォーマンスの問題が発生するサーバーがいくつかあり、パフォーマンスの問題でインシデントが発生したときに、その特定のデータベースに対してsp_updatestatsを実行します。 2000年から2016年までのすべてのバージョンが使用されている巨大な環境があります。これは、週の途中で特定のデータベースの統計更新を手動で実行している2012および2014バージョンです。

最近、トラブルが繰り返し発生しているため、非常にアクティブなデータベースに対して、sp_updatestatsを毎日スケジュールする必要がありました。

私の質問:

  1. どれくらいの頻度でスケジュールする必要がありますか?
  2. あまりにも頻繁にスケジュールすることの欠点は何ですか?
  3. コンパイルに時間がかかり、しばらくの間パフォーマンスが低下する可能性があると聞いたほど頻繁に実行される定期的な更新の欠点を回避する方法はありますか?

これで体験したことを手伝ってください。

7

どのくらいの頻度でスケジュールする必要がありますか?

これは自分で決める必要があります。

  • 問題の統計に関連する列の変更(挿入、更新、削除)によって異なります。私のスクリプト TSQL to SQL Server Statisticsのステータスを検索する を使用して、最後に更新された統計以降に変更された行の量を見つけることができます。
  • 自動統計更新がオンになっていますか?
  • 自動更新統計がトリガーされるしきい値によるテーブルのサイズ。 統計が自動的に更新されるタイミングについて Erin Stellatoが詳しく説明しています。
  • 自動統計更新が十分でない場合は、統計を手動で更新することを検討してください。
  • 2014年より前のバージョンの大きなテーブルがある場合は、トレースフラグ2371を検討してください。SQL2016のデフォルトであることに注意してください。ErikDarlingはそれについて SQL Server 2016の統計の自動更新しきい値の変更 で説明しています。

あまり頻繁にスケジュールすることの欠点は何ですか?

ケンドラ・リトルは UPDATE STATISTICS:秘密IO Explosion 同じことをより効率的に行うためのヒントがいくつかあります。

並行して実行される定期的な更新の欠点を回避する方法はありますか?

統計の更新を並行して実行するつもりなら、2つの点に注意することをお勧めします。

  1. 同じテーブルの統計を並行して実行しないでください。ブロックが発生します。 SQL 2014以降、これに改善が加えられています。詳細については、Jonathan Kehayiasによる 並列統計再構築の改善されたサポート および SQL 2014およびSQL 2016による統計更新パフォーマンスの向上 を参照してください。 Microsoft TigerチームのParikshit Savjani。
  2. 統計更新のスキャンフェーズは並列になり、SQL 2016で改善されました。並列で実行されるセッションの数に注意してください。他のセッションが使用可能なスケジューラを待機する可能性があります。関連するQ&A Parallel Statistics Update を参照してください。

3番目の質問の編集に基づいて、 Auto Update Stats Async Enabled をお勧めします。

追加のリソース:

5
SqlWorldWide

インデックスの再編成(ALTER INDEX REORG)は、インデックスの再構築とは異なり、統計を更新しません。個々のインデックスの再構築(ALTER INDEX myIndex REBUILD)は、そのインデックスの統計のみを更新します。

(断片化率などに基づいて)インデックスの再編成を実行している場合は、それを統計更新プロセスと組み合わせる必要があります少なくともで更新されなかった統計を持つインデックスインデックスの再編成(sys.dm_db_stats_propertiesを確認):

declare @tablename sysname = 'myTable';
select t.object_id, t.name, s.stats_id, p.last_updated
from sys.tables t
join sys.stats s
  on t.object_id = s.object_id
cross apply sys.dm_db_stats_properties(s.object_id, s.stats_id) p
where t.name = @tablename;
1
john