古いデータベース統計によって SharePoint Server のパフォーマンスが低下する

データベース統計について

クエリ最適化の統計は、テーブルまたはインデックス付きビューの 1 つ以上の列の値の分布に関する統計情報を含むオブジェクトです。 クエリ オプティマイザーでは、これらの統計を使用して、クエリ結果のカーディナリティ (行数) を見積もります。 これらのカーディナリティの見積もりにより、クエリ オプティマイザーは高品質のクエリ プランを作成できます。

たとえば、クエリ オプティマイザーでは、カーディナリティ推定を使用して、リソースを集中的に使用するインデックス スキャン演算子ではなくインデックス シーク演算子を選択することで、クエリのパフォーマンスを向上させることができます。 そうしないと、非効率的なクエリ プランを使用することで、古い統計によってクエリのパフォーマンスが低下する可能性があります。

大規模なエンタープライズ SharePoint 展開には、Microsoft SQL Serverに存在するコンテンツ データベースのデータベース統計を更新するためのデータベース メンテナンス 計画が必要です。 これらのタスクを実行するために、お客様は SharePoint ベースのデータベース メンテナンス ジョブだけに依存しないでください。 詳細については、「SharePoint Server ファーム内の SQL Server のベスト プラクティス」をご覧ください。

現象

データベース統計が古くなると、SharePoint Server のインストールで次の 1 つ以上の現象が発生する可能性があります。

  • 読み込み時間が遅く、パフォーマンスが低下し、サイト ページを開いたときに HTTP 500 エラーが発生する可能性がある

  • 次の例のようなエラー メッセージを生成するパフォーマンスが低下します。

    Service unavailable  
    Unknown SQL Exception 53  
    Server Error in '/' Application Runtime Error
    
  • 検索クロールを実行すると、予期しないSQL Serverパフォーマンス、データベースのロック、ブロックが発生します

  • "Microsoft SharePoint Foundation Usage Data Processing" ジョブなど、実行時間の長いタイマー ジョブでは、各イテレーションの完了に徐々に時間がかかります。

  • SharePoint サイトを開けできないことと、次のようなエラー メッセージ。

    Unexpected System.Web.HttpException: Request timed out   
    
  • ナビゲーションを読み込むとサイトレンダリングのタイムアウトが発生し、次のエラー メッセージが表示されます。

    PortalSiteMapProvider was unable to fetch children for node   
    
  • SharePoint クエリを処理するときにSQL Server実行されているサーバーでの CPU 使用率が高い

原因

これらの問題は、古いデータベース統計によって発生する可能性があります。 SharePoint は、proc_updatestatistics SQL プロシージャを使用してデータベース統計を更新するために、タイマー ジョブを毎日実行します。 ただし、さまざまな理由で、このタイマー ジョブは完了しないか、すべてのテーブルを一貫して更新しない可能性があります。 たとえば、SharePoint タイマー ジョブと同時にSQL Serverコンテンツ データベースに対してバックアップが実行されている場合、ジョブは続行されません。

統計を更新する SharePoint タイマー ジョブが完了すると、次のイベントが ULS ログに書き込まれる可能性があります。

  • e9bf "データベースの統計の更新中にエラーが発生しました, {0}"
  • cm1y "データベース内の統計の更新, {0}"
  • dbl2 "データベースの状態{1}が " であるため、データベース{0}の統計更新をスキップする
  • cm1x "上のすべてのデータベースの統計の {0}更新"

これらの条件が厳密に監視されず、修正アクションが実行されない場合は、データベース統計が古くなり、最終的に SharePoint のパフォーマンスの問題が発生します。

解決方法

これらの症状や潜在的なサービス停止を防ぐために、SQL Serverメンテナンス プランを実装して、FULLSCAN オプションを使用して SharePoint コンテンツ データベースの統計情報を更新しておく必要があります。 詳細については、「 インデックス統計」を参照してください。

SQL Server メンテナンス プランを実装して SharePoint データベースの統計を更新する場合、SharePoint からジョブを無効にする必要はありません。 ただし、これらのメンテナンス タスクは両方の場所から同様の機能を実行するため、データベースが SQL によって管理されている場合は、SharePoint ファームから "SharePoint で使用されるデータベースに古いインデックス統計がある" Heath Analyzer ルールを無効にすることは許可されます。 SharePoint Server からインデックス更新ジョブを管理する方法の詳細については、「 SharePoint で使用されるデータベースのインデックス統計が古くなっている (SharePoint 2013)」を参照してください。

詳細情報

FULLSCAN オプションを使用して SharePoint コンテンツ データベースの統計情報を、SQL Serverから毎日更新することをお勧めします。 詳細については、「SharePoint Server ファームでのSQL Serverのベスト プラクティス」および「SharePoint Foundation 2010 のデータベース メンテナンス」を参照してください。

ただし、古い STATS が原因で現在 SharePoint ファームでパフォーマンスの問題が発生している場合は、この問題を軽減するための 1 回限りの軽減手順として次の情報を使用できます。

特定のデータベースのデータベース統計情報を表示するには、次のクエリを実行します。

-- Checking the DB Stats  
select a.id as 'ObjectID', isnull(a.name,'Heap') as 'IndexName', b.name as 'TableName',   
stats_date (id,indid) as stats_last_updated_time   
from sys.sysindexes as a   
inner join sys.objects as b   
on a.id = b.object_id   
where b.type = 'U'  

データベース統計レビューの詳細については、「 DBCC SHOW_STATISTICS」を参照してください。

FULLSCAN オプションを使用する単一データベースのデータベース統計を更新するには、次のクエリを実行します。

-- Update DB Stats  
EXEC sp_MSforeachtable 'UPDATE STATISTICS ? WITH FULLSCAN'  

重要: "sp_MSforeachtable" オプションは、"現状のまま" で提供される文書化されていない手順であり、即時の問題を軽減するためにのみ使用する必要があります。 この手順は、通常のメンテナンス プランの一部として使用することはお勧めしません。 代わりに、FULLSCAN オプションを使用して統計を更新するプランを実装する方法については、 UPDATE STATISTICS (Transact-SQL) のドキュメントを参照してください。

データベース統計がどの程度古くなったかによっては、データベース統計を更新した後に DBCC FREEPROCCACHE コマンドを実行して、クエリ プランキャッシュをクリアしなければならない場合があります。 このプロシージャの構文と引数は 、DBCC FREEPROCCACHE (Transact-SQL) にあります。 これにより、データベース統計が更新された後に、新しいクエリで最適な実行プランが使用されるようになります。 たとえば、次のクエリを参照してください。

-- Remove all elements from the plan cache  
DBCC FREEPROCCACHE  

重要

DBCC FREEPROCCACHE コマンドを実行すると、SQL インスタンス内のすべてのクエリ プランのキャッシュがクリアされます。 このコマンドは、運用環境で実行する前に十分に理解しておく必要があります。

古いデータベース統計を更新した後に DBCC FREEPROCCACHE コマンドが実行されなかった場合でも、非効率的な実行プランを持つクエリがキャッシュに存在し、使用される可能性があります。 この場合は、ストアド プロシージャを使用して指定したストアド プロシージャを強制的に再コンパイルします ( 「sp_recompile (Transact-SQL)」を参照してください)。 たとえば、次のクエリを参照してください。

USE SP2013_Content_DB  
GO  
sp_recompile proc_getwebnavstruct  

プロシージャ、関数、またはテーブル パラメーターと共に sp_recompile コマンドを実行すると、インスタンスに影響を与えずに、削除のためにキャッシュ内の 1 つの要素が対象になります。

さらにヘルプが必要ですか? SharePoint コミュニティにアクセスしてください。