web-dev-qa-db-ja.com

_WA_Sys統計はいつ更新されますか?

自動生成された_WA_Sys_統計の一部がデータベースにありますが、しばらく更新されていません(同じテーブルの他の統計と比較して)

経験則は、統計が20%+ 500行のデータ変更で更新される500行を超えるテーブルにあるようです。

しかし、私は次のクエリを使用して見ることができます

SELECT  t.name,
        i.name,
        i.rowcnt,
        i.rowmodctr,
        p.last_updated
FROM    sys.sysindexes i
        JOIN sys.tables t
            ON i.id = t.object_id
        JOIN sys.stats s
            ON s.object_id = t.object_id AND i.name = s.name
        CROSS APPLY sys.dm_db_stats_properties(s.object_id,s.stats_id) p
WHERE   rowmodctr > 0
ORDER BY i.rowmodctr DESC

いくつかの_WA_Sys_統計が古くなっている(そして20%+ 500を超えるrowmodctrがある)テーブルがあること

テーブルに対してクエリを実行し、WHERE句に古い_WA_Sys_統計に関連付けられた列の1つを追加し、統計の更新日を確認すると、統計が更新されていることがわかります。

同じクエリをWHERE句でもう一度実行すると、統計が更新されません

それらを使用するクエリが実行されたときに_WA_Sys統計が更新され、古くなっているようです。

7
SEarle1986

SQL Serverは、使用する統計のみを自動的に更新します。決定の一部としてロードすることはできますが、カーディナリティの推定に_WA_Sys統計を積極的に使用していない可能性があります。

クエリに使用されている統計を確認するには、これをクエリの最後に追加し、[メッセージ]タブを確認します。

OPTION(QUERYTRACEON 3604, QUERYTRACEON 2363);

データベースが2014年より前の互換レベルにある場合は、次のものが必要です。

OPTION(QUERYTRACEON 3604, QUERYTRACEON 9292, QUERYTRACEON 9204);

これらはあなたに教えてくれません理由特定の統計を使用していませんが、一般的に同じ列に高いサンプリング率で作成された統計がある場合、低いサンプリング率の統計は好ましくありません。

統計の更新は変更時に発生せず、それを使用するクエリが実行されたときにのみ発生することに注意してください

10
Erik Darling