MSDNから:
「挿入操作昇順または降順キー列で発生し
、このようなIDENTITYやリアルタイムのタイムスタンプ列としてキー列を、昇順または降順に統計、クエリオプティマイザが実行するよりも、より頻繁に統計情報の更新が必要な場合があります。挿入操作が列を昇順または降順に新しい値を追加統計が最新ではなく、クエリが最後に追加された行から選択した場合、現在の統計にはこれらの新しい値のカーディナリティの推定値が含まれません。カーディナリティの推定値が不正確になり、クエリのパフォーマンスが低下します。
たとえば、統計が最新の受注日のカーディナリティ推定値を含むように更新されない場合、最新の受注日付から選択するクエリは不正確なカーディナリティ推定値を持ちます。
メンテナンス操作後
後テーブルの切り捨てや行の大部分の一括挿入の実行など、データの分布を変更するメンテナンス手順を実行した後、統計の更新を検討してください。これにより、クエリが統計の自動更新を待つ間、クエリ処理の将来の遅延を回避できます。」
システムで時々「EXEC sp_updatestats」を使用するか(スケジュールされている)、すべてのオブジェクトで関数STATS_DATEを使用して、前回統計が実際に更新された時期を確認し、それ以降時間が長すぎる場合は、UPDATEを使用しますその特定のオブジェクトの統計。私の経験では、自動統計を有効にしても、自動更新をトリガーしなかった挿入操作のために、時々統計を更新する必要があります。
私の個人コードを追加するには(統計更新用の動的ステートメントを作成する毎週のジョブで使用):
select distinct
'update statistics [' + stats.SchemaName + '].[' + stats.TableName + ']'
+ case when stats.RowCnt > 50000 then ' with sample 30 percent;'
else
';' end
as UpdateStatement
from (
select
ss.name SchemaName,
so.name TableName,
so.id ObjectId,
st.name AS StatsName,
STATS_DATE(st.object_id, st.stats_id) AS LastStatisticsUpdateDate
, si.RowModCtr
, (select case si2.RowCnt when 0 then 1 else si2.RowCnt end from sysindexes si2 where si2.id = si.id and si2.indid in (0,1)) RowCnt
from sys.stats st
join sysindexes si on st.object_id = si.id and st.stats_id = si.indid
join sysobjects so on so.id = si.id and so.xtype = 'U' --user table
join sys.schemas ss on ss.schema_id = so.uid
) stats
where cast(stats.RowModCtr as float)/cast(stats.RowCnt as FLOAT)*100 >= 10 --more than 10% of the rows have changed
or ( --update statistics that were not updated for more than 3 months (and rows no > 0)
datediff(month, stats.LastStatisticsUpdateDate, getdate()) >= 3
and stats.RowCnt > 0
)
ここでは、3か月以上統計が更新されていない、または最後の統計が更新されてから10%を超える行が変更されたすべてのオブジェクトを取得します。
where col=(cast @var...)
)であり、私は1〜2週間前にそれを継承しましたが、交換されるまで基本的に機能し続ける必要があります。リンクをお寄せいただきありがとうございます。@var
'%'